인프런 커뮤니티 질문&답변

mhyim님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)

Protobuf 이식 (코드 리뷰)

SendBuffer.cs 삭제 후 대체 되는 부분의 장단점?

해결된 질문

24.10.11 22:34 작성

·

24

·

수정됨

1

루키스님 안녕하세요?

기존 SendBuffer.cs는 메모리 누수 이슈 등으로 삭제하고

새로운 기법을 알려준다고 말씀해주셨는데

 

그게 최종적으로 ClientSession.cs의 Send()함수가 되는게 맞을까요? (아래 코드블록)

맞다면 Send()가 호출 될 때 마다 버퍼를 새로 생성하기 때문에

SendBuffer.cs의 강점이었던 하나의 거대한 메모리를 사용하면서 버퍼 생성 및 Copy가 줄어드는 이점이 없어진 걸로 이해가 됐는데,

기존의 SendBuffer.cs와 새로운 대체된 Send()의 장단점이 각각 궁금합니다.

 

ClientSession.cs

public void Send(IMessage packet)
{
	string msgName = packet.Descriptor.Name.Replace("_", string.Empty);
	MsgId msgId = (MsgId)Enum.Parse(typeof(MsgId), msgName);
	ushort size = (ushort)packet.CalculateSize();
	byte[] sendBuffer = new byte[size + 4];
	Array.Copy(BitConverter.GetBytes((ushort)(size + 4)), 0, sendBuffer, 0, sizeof(ushort));
	Array.Copy(BitConverter.GetBytes((ushort)msgId), 0, sendBuffer, 2, sizeof(ushort));
	Array.Copy(packet.ToByteArray(), 0, sendBuffer, 4, size);
	Send(new ArraySegment<byte>(sendBuffer));
}

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2024. 10. 13. 17:44

장점 : 필요한 만큼 메모리를 할당해서 사용
단점 : 매 번 마다 할당해야 함

~입니다.
고전적인 메모리 풀링을 사용하면 큰 덩어리를 만들어서 필요할 때마다 쪼개 사용하는 개념인데요.
하지만 C++과 다르게 C#에선 자유로운 RefCount 및 메모리 관리가 힘들어서
사용한 메모리 하나라도 사용중이면 반납이 안 되면
또 MemoryChunk를 할당해야 하므로 살짝 지저분하긴 하죠.
그래서 4강 강의에서 사용하던 방식은 요렇게 수정된 것입니다.

mhyim님의 프로필 이미지
mhyim
질문자

2024. 10. 15. 00:12

시간 내서 답변해주셔서 정말 감사합니다!

mhyim님의 프로필 이미지

작성한 질문수

질문하기