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

mhyim님의 프로필 이미지
mhyim

작성한 질문수

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

Protobuf 이식 (코드 리뷰)

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

해결된 질문

작성

·

37

·

수정됨

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
지식공유자

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

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

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

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

mhyim님의 프로필 이미지
mhyim

작성한 질문수

질문하기