게임 서버 개발에서 데이터 전송을 위한 버퍼(Buffer)의 개념과 이를 C#에서 구현하기 위한 ArraySegment를 소개하고 있습니다. 버퍼는 데이터를 일시적으로 저장하고 전송할 때 사용되는 메모리 영역이며, C#에서는 ArraySegment를 활용하여 구현할 수 있습니다. ArraySegment는 배열의 특정 부분을 참조하는 용도로 사용되며, 메모리를 효율적으로 활용하여 재사용할 수 있습니다. 이를 게임 서버에서 활용한 예시 코드도 제시하며, Array와 ArraySegment의 차이, 활용 방법 등을 설명하고 있습니다.
게임 개발 프로젝트를 하면서 서버 파트를 맡게 되었습니다.
여기서 클라이언트와 서버가 데이터를 주고받기 위해서 버퍼라는 개념을 사용했습니다.
버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송할 때 일시적으로 데이터를 보관하는 메모리의 영역을 뜻합니다.
이런 버퍼 영역은 일정한 메모리 영역을 전송이 완료된 데이터를 다시 비워주고,
보낼 데이터를 다시 채워주는 역할을 해야 합니다.
C#에서는 이런 버퍼를 Array가 아닌 ArraySegment를 사용해서 구현할 수 있습니다.
ArraySegment는 해당 배열의 요소 범위를 구분하는 배열 주위의 래퍼입니다.
여러 ArraySegment 인스턴스가 동일한 원래 배열을 참조할 수 있으며 겹칠 수 있습니다.
원래 배열은 1차원이어야 하며 0부터 시작하는 인덱싱이 있어야 합니다.
세그먼트는 여러 산업 분야(컴퓨터, 마케팅 등)에 사용되는 단어입니다.
간단하게 보면 분할, 구간, 세부 부분을 쪼개는 것을 뜻합니다.
컴퓨터 분야에서는 네트워크 통신에 대한 것과 메모리에 세그먼트를 사용합니다.
메모리에서는 물리적인 단위가 아닌 논리적 내용 단위로 자르는 것 방법을 세그먼테이션이라고 합니다.
여기서 논리적인 단위는 모두 같은 단위로 나누는 것을 뜻하고,
세그먼테이션은 각각 다른 크기로 나누는 것을 뜻합니다.
위 내용을 정리하면 아래와 같습니다.
배열의 특정 위치에서 특정 크기만큼 참고하고 싶을 때
보통 새로 배열을 만든 후 복사해야 원하는 데이터만 참조할 수 있습니다.
하지만 ArraySegment를 사용하면 새로 배열을 만들지 않으면서
버퍼의 특정 데이터를 참조할 수 있습니다.
// 원본 배열 생성
int[] originalArray = { 1, 2, 3, 4, 5 };
// ArraySegment 생성
ArraySegment<int> segment = new ArraySegment<int>(originalArray, 1, 3);
// ArraySegment를 사용하여 요소에 액세스
int element = segment[0]; // element에는 2가 저장됨
public class SendBuffer
{
byte[] _buffer;
int _usedSize = 0;
public int FreeSize { get { return _buffer.Length - _usedSize; } }
public SendBuffer(int chunkSize)
{
_buffer = new byte[chunkSize];
}
public ArraySegment<byte> Open(int reserveSize)
{
if (reserveSize > FreeSize)
return null;
return new ArraySegment<byte>(_buffer, _usedSize, reserveSize);
}
public ArraySegment<byte> Close(int usedSize)
{
ArraySegment<byte> segment = new ArraySegment<byte>(_buffer, _usedSize, usedSize);
_usedSize += usedSize;
return segment;
}
}
게임 서버에서 클라이언트로 패킷을 전송할 때 Buffer를 활용하기 위해 구현된 코드입니다.
Buffer를 사용할 때 Array를 여러번 생성하는 것이 아닌, ArraySegment를 사용해서 참조하면서 배열을 재활용 할 수 있습니다.
게임 서버 Rookiss님 강의를 들으면서 Buffer의 개념을 이해하는데 꽤 어려웠습니다.
갑자기 ArraySegment라는 새로운 개념과 배열을 효율적으로 사용하기 위한 코드가 이해하기 힘들었습니다.
아무래도 강의를 보고 구현을 할 당시에 ArraySegment 라는 키워드를 주의깊게 찾아보고 정리하지 않았던 것이 큰 것 같습니다.
이번에 정리를 하면서 Array와 ArraySegment에 대해 좀 더 알게 되었습니다.
ArraySegment를 Array를 대신하기 위한 것이 아닌,
Array를 참조를 통해 필요한 구간을 참조해 재사용 할 수 있게 도움을 주는 래퍼입니다.
잘 배워갑니다~!