초당 약 30 개의 업데이트 (또는 10 또는 20 개 미만) 만 필요합니다. 움직이는 클라이언트 객체의 위치를 클라이언트 측으로 보간합니다. 일반적으로 데이터는 정말 필요할 때만 보내야합니다. 와우에서는 같은 위치에있는 플레이어보다 그룹에 속한 플레이어로부터 더 많은 업데이트를받을 수 있습니다. 또한 다른 플레이어가 당신과 멀리 떨어져 있다면, 그에 대한 초당 많은 업데이트를받지 못합니다.
그런 다음 연결할 때 각 플레이어에게 하나의 완전한 스냅 샷을 보냅니다. 그 후에는 게임 오브젝트의 변경 사항 만 보냅니다. 변경 사항이 없으면 보내지 마십시오.
그런 다음 BitVectors를 많이 사용하거나 불필요한 벡터의 양을 줄이기 위해 호출 할 수 있습니다! 예 : 1 바이트 (0 ~ 1 또는 -1 ~ 1 범위) 만 사용하여 float를 쓰려고 시도하면 256 또는 128 개의 다른 값 만 가질 수 있습니다. 그러나 보간 덕분에 플레이어는 흔들림을 느끼지 않습니다.
데이터 압축 방법에 대한 LidgrenLibrary의 예는 다음을 참조 하십시오 . http://code.google.com/p/lidgren-network-gen3/wiki/Optimization
다음 : 플레이어가 움직일 때 시야 반경을 줄이고 그 당시 중요한 정보 만 전송하십시오. 그런 다음 멈 추면 시야 반경을 다시 증가시킵니다. 공간 해싱 시스템 또는 bsp 트리를 사용하여 "범위 내에있는"객체를 찾는 오버 헤드를 줄일 수 있습니다. http://en.wikipedia.org/wiki/Collision_detection 주제를 잘 읽어보십시오 .
또한 데이터 구조와 데이터의 시간적 일관성 (악용 될 수 있고 악용 될 수 있음)에 대해서만 알고 있는 데이터를 직접 압축하십시오 . Bzip2, Deflate와 같은 일반적인 알고리즘을 사용해야하지만 압축의 최종 단계로만 사용해야합니다!
또한 게임에 중요하지 않은 정보의 경우 추가 P2P 기술을 사용할 수도 있습니다. 예 : 플레이어가 "hello"애니메이션을 재생합니다. (그래픽 효과 일뿐) 플레이어는이 정보를 서버로 보내지 만 서버는 정보를 다른 플레이어에게 릴레이하지 않습니다. 대신이 중요하지 않은 효과는 플레이어 자체에 의해 범위 내의 다른 클라이언트에게 전송됩니다.
편집 (의견 때문에) :
각 플레이어의 초당 평균 비트 수를 줄이는 추가 방법 :
당신은 "개체가 바뀌지 않았다"라고 썼다. 그렇게 할 이유가 없습니다. 패킷 손실에 대해 걱정하고 (이로 인해 시뮬레이션이 동기화되지 않는 경우) 다음을 고려하십시오. 각 고정 된 시간 간격 (예 : 100, 200, 300, 400 ...)에서 시뮬레이션 상태를 해시하여 서버로 전송 . 서버는 모든 데이터의 전체 스냅 샷을 확인하거나 다시 보냅니다.
로켓이나 플레이어와 같은 경우 시뮬레이션을보다 사실적으로 만들기 위해 보간뿐만 아니라 외삽을 사용할 수도 있습니다. 'Rocket'예 : '현재 위치 x에 있습니다'와 같은 메시지로 업데이트하는 대신 다음을 포함하는 메시지를 한 번만 보냅니다. "Rocket Spawned : position (vector), Time (로켓이 생성 된 시뮬레이션 단계), velocity ( 벡터)". 팁이 항상 "속도"방향에 있기 때문에 회전을 포함하지 않아도됩니다.
udp 헤더가 메시지 자체보다 크기 때문에 하나의 메시지에 여러 명령을 결합하고 16-20 바이트보다 작은 메시지를 보내지 마십시오. 또한 조각화로 인해 전송 속도가 느려지므로 프로토콜의 MTU보다 큰 패키지를 보내지 마십시오.