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

공부해보자님의 프로필 이미지
공부해보자

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Serialization #4

sendbuffer에 관하여 질문있습니다

해결된 질문

작성

·

241

0

패킷을 만들면서 생각해보니 결국 마지막 count 값이 보낼 패킷의 전체 크기를 나타내는것 같은데

그렇다면 각 패킷마다 count를 먼저 계산하고 해당 count 크기의 바이트 배열을 만든다음 이 배열에 정보를 넣어서 보내는 방법이 더 메모리를 아낄 수 있지 않나요? 

앞선 강의(SendBuffer)에선 가변적인 패킷의 길이를 알 수 없으므로 무작정 크게 잡는것이 메모리 낭비라고 하셨는데 count를 통해 패킷의 전체 크기를 알기 때문에 딱 맞춰서 보낼 수 있지 않나요?

답변 3

2

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

아하 질문을 잘못 이해했네요.
패킷 데이터를 먼저 채우고 -> 크기를 계산한 다음 -> 버퍼를 딱 그만큼 할당
위 흐름을 말씀하시는거군요.
다시 답변을 드리자면, 물론 그것도 가능합니다.
실제로 Part7에서 ProtoBuff로 이식할 때는 그런 방식으로 수정될 예정입니다.

다만 C++에서는 패킷 데이터를 채운 다음에 버퍼를 만드는게 아니라,
바로 버퍼에 데이터를 복사하면서 패킷을 만드는 방식이 있는데
ProtoBuff와 쌍을 이루는 FlatBuffer가 그런 방식으로 되어 있습니다.
(그러면 중간 복사 과정을 한 번 덜어낼 수 있어서 성능에 장점이 있습니다.)

1

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

좋은 시도이지만, 각 패킷마다 count를 미리 계산할 수 없다는 함정이 있습니다.
가령 패킷에 길드이름이나 유저이름을(string) 받는다면,
해당 문자열의 사이즈가 얼마가 될지 모르니 무조건 최대 사이즈로 잡을 수밖에 없겠죠.
마찬가지로 몬스터 리스트라거나 가변 데이터를 넣을 일이 빈번하기 때문에
동일한 패킷이라 하더라도 상황에 따라 크기가 바뀔 수 있습니다.

0

답변 감사합니다!

아래와 같은 경우처럼 가변적인 경우에도 count값을 구할 수 있지 않나요?

패킷의 Write함수를 위와 같이  사용하면 가변적인 string 크기에도 맞추어서 버퍼 할당이 가능하지 않나요?

공부해보자님의 프로필 이미지
공부해보자

작성한 질문수

질문하기