먼저 프로토콜 준수 방식으로 관련 데이터를 나타내는 방법을 알아야합니다. 이것은 게임과 관련된 데이터에 따라 다릅니다. RTS 게임을 예로 사용하겠습니다.
네트워킹을 위해 게임의 모든 엔티티 (예 : 픽업, 유닛, 건물, 천연 자원, 파괴 가능)가 열거됩니다.
플레이어는 자신과 관련된 데이터를 가져야합니다 (예 : 모든 보이는 단위).
- 그들은 살아 있거나 죽었습니까?
- 그들은 어떤 유형입니까?
- 그들은 얼마나 많은 건강을 남겼습니까?
- 현재 위치, 회전, 속도 (속도 + 방향), 가까운 미래 경로 ...
- 활동 : 공격, 걷기, 건물, 고정, 치유 등
- 버프 / 디버프 상태 효과
- 그리고 아마도 마나, 방패 등의 다른 능력치?
처음에는 플레이어가 게임에 입장하기 전에 전체 상태를 받아야합니다 (또는 플레이어와 관련된 모든 정보).
각 장치에는 정수 ID가 있습니다. 속성이 열거되므로 완전한 식별자도 있습니다. 단위 ID는 길이가 32 비트 일 필요는 없습니다 (절충하지 않아도 될 수 있음). 그것은 20 비트 일 수 있습니다 (속성을 위해 10 비트를 남겨 둡니다). 유닛의 ID는 고유해야하며, 유닛이 인스턴스화 및 / 또는 게임 세계에 추가 될 때 카운터에 의해 할당 될 수 있습니다 (건물 및 자원은 고정 유닛으로 간주되며 맵에서 자원은 ID로 할당 될 수 있음) 로드 됨).
서버는 현재 전역 상태를 저장합니다. 각 플레이어의 가장 최근에 업데이트 된 상태는 list
최근 변경 사항 에 대한 포인터로 표시됩니다 (포인터 이후의 모든 변경 사항은 해당 플레이어로 아직 전송되지 않음). 변경 사항이 list
발생할 때 추가됩니다 . 서버가 마지막 업데이트를 보낸 후에는 목록을 반복하기 시작할 수 있습니다. 서버는 플레이어의 포인터를 목록을 따라 꼬리로 옮기고 도중에 모든 변경 사항을 수집하여 보낼 버퍼에 배치합니다. 플레이어 (즉, 프로토콜의 형식은 다음과 같을 수 있습니다 : unit_id; attr_id; new_value) 새로운 유닛도 변경으로 간주되며 모든 속성 값과 함께 수신 플레이어에게 전송됩니다.
가비지 컬렉터와 함께 언어를 사용하지 않는 경우 지연되는 포인터를 설정 한 다음 목록에서 가장 오래된 플레이어 포인터를 따라 잡아 객체를 해제해야합니다. 우선 순위 힙에서 가장 오래된 플레이어를 기억하거나 게으른 포인터가 같을 때까지 (즉, 플레이어 포인터 중 하나와 동일한 항목을 가리킬 때) 반복하고 해제 할 수 있습니다.
제기하지 않은 몇 가지 질문은 흥미 롭습니다.
- 클라이언트가 모든 데이터를 담은 스냅 샷을 먼저 받아야합니까? 시선 이외의 품목은 어떻습니까? RTS 게임에서 전쟁의 안개는 어떻습니까? 모든 데이터를 보내면 클라이언트가 해킹되어 다른 보안 조치에 따라 플레이어가 사용할 수없는 데이터를 표시 할 수 있습니다. 관련 데이터 만 보내면 문제가 해결 된 것입니다.
- 모든 정보를 보내는 대신 변경 사항을 보내야하는 경우는 언제입니까? 최신 머신에서 사용할 수있는 대역폭을 고려할 때 모든 정보를 보내는 대신 "델타"를 보내면 어떤 이점이 있습니까?