대역폭을 낮게 유지하기위한 MMO 기술, 알고리즘 및 리소스?


9

현재 MMO가 압축에서 클라이언트 처리로 동작 및 이동 데이터를 처리하는 방법에 대한 리소스와 문서가 있습니까? 움직임 예측 알고리즘에 대한 자료가 있습니까?

특히 움직임이 느리고 지연 시간을 낮게 유지하는 데 관심이있는 사람들에 관심이 있습니다. 또한 다양한 유형의 MMO (네트워크 현명한)에 ​​대한 패킷 속도와 크기는 무엇입니까?

플레이어가 도달 할 수 없거나 나중에 볼 수있는 경우 패킷 속도를 조정하거나 일부 패킷을 완전히 비활성화하는 방법이 있습니까?

답변:


9

글쎄요, 이 책이 있습니다.이 책 은 지금 조금 낡았지만, 실제로 읽지는 못했지만, 유명한 출판사에서 온 것입니다. 나는 또한 이것이 새로운 것을 찾았 지만 전에는 들어 본 적이 없다. 둘 다 MMO (또는 최소한 온라인) 게임 개발 문제를 다루고 있다고 주장합니다. 즉, 클라이언트 측 예측은 동시 플레이어 규모에 관계없이 거의 동일하며 Google에는 이에 대한 많은 정보가 있습니다 .

실용적 관점에서 볼 때 인디 / 취미 개발자 는 "대규모"로 간주 될만큼 이론상 최대 동시성을 달성 할만큼 충분한 플레이어 확보 할 수있을 정도로 인기있는 게임을 만드는 것이 다소 어렵다는 것을 인식하는 것이 중요합니다 .그러나이 기술은 여전히 ​​연구 교육이 될 수 있습니다.

할 수있는 일에는 크게 두 가지 분류가 있습니다.

  • 최소량의 데이터 만 필요한 최소 클라이언트 집합으로 전송하는 데 적극적입니다.
  • 플레이어가 너무 많은 덩어리를 갖도록 동기를 부여하지 않는 게임을 디자인하여 "필요한 고객 세트"를 일반적으로 작게 유지하는 데 도움이됩니다.

두 번째는 실제로 게임 디자인 및 사회적 조작 문제입니다. 멀티 플레이어 게임은 본질적으로 사회적이기 때문에 특히 까다로워서 매력적이기 때문에 플레이어 무리를 너무 낙담시키고 싶지 않습니다. 다른 한편으로, 세계의 모든 사람들이 게임에서 최고의 전리품을 떨어 뜨리는 사람을 스폰 캠핑하는 게임은 확장하기가 어려울 것입니다.

첫 번째 옵션으로는 계층화 된 메시징을 고려할 수 있습니다. 직책과 같이 항상 알아야하는 다른 플레이어에 대한 몇 가지 사항이 있습니다. 그러나 건강과 같은 다른 것들은 현재 플레이어가 아직 볼 수없는 물체에 중요하지 않을 수 있으므로, 근처에있는 다른 모든 엔티티의 상대 거리에 따라 플레이어에게 보내는 것을 게이트합니다. 질문의 마지막 부분에서 언급 한 바와 같이 전송하는 데이터와 필터링합니다.

매우 큰 규모의 멀티 플레이어 아키텍처는 즉각적인 조치가 필요없는 보고서를 버퍼링합니다. 서버로 전송 된 문자 저장 메시지는 델타에서 수행 할 수 있으며 중요 지점에서만 전체 업데이트가 가능하며 이러한 업데이트는 제한 서버에서 버퍼링되어 실제로 문자 데이터를 안정적으로 유지하는 서버로 전송됩니다. 정기적 인 방식-플레이어의 기본 규모에 따라 디스크 트래픽과 네트워크 트래픽 최적화에 대해 걱정해야합니다. 캐릭터 데이터베이스가 쓰러지는 것을 원하지 않습니다.

MMO 이외의 게임에서와 마찬가지로 패킷 속도와 크기는 게임마다 크게 다릅니다. 실제로 요구 사항에 따라 다르며 일반화 된 표준이 없습니다.


1
첫 번째 책 (Massively Multiplayer Game Development 2)의 속편도 있습니다. 내 의견으로는 굉장히 유용한 책 시리즈는 아니지만 (대부분의 게임 개발 책과 마찬가지로 MMO-in-x-hours 책은 처음부터 끝이 아닙니다) 이론적 문제 중 일부를 논의합니다. 이 질문에 물었다. 그리고 이미 MMO를 부분적으로 개발 한 사람에게 더 유용 할 것입니다.
Ricket

5

위의 답변 외에도 TCP_NODELAY와 창 크기 조정 작동 방법을 읽으십시오. TCP의 세부 사항을 이해하고 (그렇습니다. 순서에 관계없이 도착하는 차등 업데이트를 처리 할 가능성이 없다면 TCP가 아닌 UDP를 사용하고 싶습니다) 재전송은 대기 시간 제어에 중요합니다.


4
차등 업데이트 (일반적으로 게임 구조의 이진 차이)를 사용하고 비 순차적 전달 (신뢰할 수 있는지 여부)을 사용하는 경우 후회하게됩니다. 게임에서 TCP를 싫어하는 사람들은 일반적으로 TCP에 대해 충분히 알지 못합니다 (예 : NODELAY의 기능 이해). UDP는 비 순차적 패킷을 간단히 삭제할 수있는 음성 데이터와 같은 작업에 적합합니다. 이는 게임에서 거의 해당되지 않습니다.
coderanger

1
"드물게 게임의 경우"? 서버가 매 프레임마다 권위있는 게임 상태를 제공한다면, 나는 과거에 일어난 일을 신경 쓰지 않습니다. UDP 패킷에서 단조 증가하는 간단한 프레임 번호가 이에 적합합니다. 실제로 얼마나 많은 데이터를 안정적으로 전송해야합니까?
ChrisE

2
"서버가 모든 프레임에 대해 권위있는 게임 상태를 제공 한 경우"제공합니다. "차등 업데이트를 사용하는 경우"라고 말했는데, 매 프레임마다 전체 상태를 유지하는 것과 반대입니다. 전 세계에 복잡한 수준의 MMO에서는 전체 업데이트를 자주 제공하는 것이 불가능합니다.
coderanger

1
변화하는 것들의 완전한 상태를 보내더라도, 당신은 물건들을 병합하는 것이 불가능할 수있는 고장난 배달 문제로 끝납니다. 업데이트 "x = 1, y = 2"와 "y = 1, z = 2"를 생각해보십시오. 그 값이 거꾸로 도착하면 "첫 번째"값을 삭제하여 y 값이 정확하지만 x에 대한 변경 내용을 잃게됩니다.
coderanger

1
@Adam 내가 TCP 스펙을 읽고 창 스케일링이 어떻게 작동하고 어떻게 재전송과 상호 작용하는지 이해해야한다고 말한 이유입니다. ;-) TCP를 다시 쓰는 것은 기본적으로 항상 잘못입니다. 안정적인 순서대로 전달하려면 UDP를 사용하지 않아야합니다.
coderanger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.