플레이어 위치는 WoW와 같은 MMORPG에 어떤 종류의 변수 형식으로 저장됩니까?


18

J. Carmack이 빠르게 그것에 대해 이야기하는 것을 들었습니다.

소프트웨어가 어떻게 영역간에로드하지 않고 멀티 플레이어 규모로 거대한 세상에있을 때 플레이어의 위치를 ​​정확하게 추적 할 수 있습니까? 데이터가 넷 코드를 통과 할 때 어떻게 형식화됩니까?

버텍스가 그래픽 카드의 메모리에 저장되는 방식을 이해할 수 있지만 멀티 플레이어를 동기화 할 때 가장 좋은 것이 무엇인지 상상할 수 없습니다.

답변:


26

Scott Bilas는 Dungeon Siege 에서 일했으며 "Continuous World of Dungeon Siege"를 썼습니다 . Dungeon Siege는 MMO가 아니지만 세계는 있지만 그의 논문에서 플레이어 위치에 대해 이야기합니다. 나는 그것을 잘 읽었다. 관련 섹션은 다음과 같습니다.

정밀 이슈

엔지니어링 팀은 처음부터 지속적인 세계가 엔진과 콘텐츠 디자인에 큰 영향을 미칠 것이라는 사실을 알고 있었고 핵심 문제는 수치 안정성이었습니다. 원점에서 동쪽으로 2 미터 떨어진 곳에서 형성되는 두 인물이 있다고 상상해보십시오. 어떤 시점에서 서로의 거리는 원점과의 거리에 압도되어 캐릭터는“같은 위치에”있는 것처럼 보입니다.

부동 소수점을 사용하면 원점에서 멀어 질수록 정밀도가 떨어지고 모든 방식의 불쾌한 문제가 발생할 수 있습니다. 상황이 제대로 정렬되지 않고 인접한 메시 사이에 균열이 나타나고 공간이 양자화되기 시작하며 고양이와 개가 함께 살기 시작합니다. Dungeon Siege는 명백한 성능 이점을 위해 비디오 하드웨어의 기본 정밀도와 일치시키기 위해 단 정밀도 모드에서 FPU를 사용합니다. 그러나 정밀도를 높이더라도 세계가 엄청나게 커져서 결국 문제를 해결할 수는 없었습니다.

정밀도 문제는 대부분의 다른 게임과 마찬가지로 통합 세계 좌표 공간을 가질 수 없다는 것을 의미했습니다. 대신, 연속 세계를 독립적 인 좌표 공간으로 분할하고 주기적으로 전환하여 정밀도를 재설정하는 것이 해결책이었습니다. 이러한 제약 조건 내에서 다양한 아이디어가 시도되었으며 결국 표준 포털 시스템의 변형에 착수했습니다.

우리의 솔루션은 관계형 노드 기반 좌표 시스템으로 구성되는데, 각 지오메트리 (공성 노드)에는 고유 한 좌표 공간이 있으며 이웃 노드와 공통으로 공유하는 문을 통해 이웃 지오메트리에 공간적으로 연결됩니다. 문으로 연결된 노드의 배열은 전체 세계지도를 나타내는 연속 그래프를 형성합니다. 이 노드 시스템은 공간을 효율적으로 세분화하는 기본 방법이자 수많은 최적화의 근본이되기 위해 FPU 정밀도를 유지한다는 원래 목표에서 시간이 지남에 따라 발전했습니다.

특정 노드를 기준으로 3D 위치 개념을 캡슐화하려면 기존의 (x, y, z) 벡터를 노드 ID (x, y, z, node)로 보강하고 원점에서 오프셋을 나타내야합니다. 대신 특정 노드의. 이 4 튜플은 Siege Node Position 또는 SiegePos로 캡슐화됩니다. 나중에 노드 간 방향 간의 비교를 처리하기 위해 SiegeRot (quaternion, node)를 추가했습니다.

"세계 공간이 없다"라는 문구는 팀의 만트라가되었지만 모든 사람들이 의미를 완전히 이해하는 데 문자 그대로 몇 년이 걸렸습니다.

Dungeon Siege에서 그의 논문을 더 볼 수 있습니다 .


그것은 매우 끈적 끈적한 답변 인 것 같습니다! 감사 ! 오늘 게임에서 gmp의 정수처럼 림 베드 숫자를 사용할지 궁금했습니다.
jokoon

3

거대한 구역이없는 세계의 경우 배정 밀도 버텍스를 사용하거나 작은 덩어리가 땅을 나누는 부동 소수점을 사용합니다.

각 청크에는 자체 좌표계가 있습니다. 이러한 각 청크로 경계를 넘어 가면 모든 것을 해당 좌표계로 변환합니다. 어쨌든 비행 시뮬레이션에서 그렇게하는 방법입니다.

작은 영역이 있다면 float만으로 충분하다고 생각합니다.


배정도는 큰 성능과 메모리 이점을 빠르게 발생시킵니다. (x, y, z, zone)은 16 바이트입니다. (x, y, z) 복식은 24 이상입니다. 빠른 계산을 할 수 없으며 그래픽 카드에서는 사용할 수 없습니다.

페르미 카드는 배정도를 사용할 수 있습니다.) 그래, 청크 접근 방식은 그 대답이 어쨌든 제안하는 것입니다.
일러

2

실제 위치에 대해 3 개의 수레로 구성된 벡터라고 말하고 싶습니다. 그러나 플레이어와 관련된 영역 인덱스도 있습니다. (해당 영역 서버에서 처리하는 모든 항목이 동일한 영역에 있으므로 동일한 데이터 구조 일 필요가 없으므로 위치의 일부가 아닙니다.)

최소 4 개의 영역이 있습니다. 4 대륙. 나는 그중 어느 쪽도 약 10km 이상이라고 생각하지 않습니다. 예를 들어, 최신 확장판 이전 의이 블로그는 전체 여행 가능 영역을 41 평방 마일로 계산합니다. 모든 전장과 모든 인스턴스는 각각 자체 구역에 있으며 공간도 조정합니다.

LUA API를 사용하면 플레이어의 위치를 ​​가져올 수 있습니다. GetPlayerMapPosition ()은 전체 세계지도에 따라 비율로 각각 0에서 1까지 두 개의 부동 소수점을 반환합니다.


1

WoW의 경우 간단한 float x / y / z를 사용하지만 특정 '영역'과 관련이 있습니다.

이것은 보트 및 제플린과 같은 '이동 구역'을 처리하는 데 도움이 될 것입니다


1

Wow, Tibia 등과 같은 보통 온라인 게임. 플레이어 위치를 저장하십시오. SQ1 플레이어 메타 테이블에서 세 개의 변수 X + Y + Z를 사용합니다. Runescape는 Z없이이를 수행합니다. 플레이어는 항상 그라운드 메시의 상단에 렌더링됩니다.


메타 테이블이란? 나는 그것이 DB에 저장되어 있는지 의심 스럽다. 실시간으로 사용해야한다.
jokoon

(1)이 경우의 메타 테이블은, 예를 들어 기본 문자 데이터를 갖는 DB 테이블이다. 성별, 위치 xyz, 건강 상태, 은행의 현금 등 (2) 열린 Tibia 서버를 호스팅하고 있으며 플레이어 pos는 서버 캐시에 저장되어 있습니다. 그러나 ... 30 ~마다 서버가 저장되고 플레이어의 POS가 플레이어 메타 데이터에 추가됩니다. 서버가 종료됩니다한다면 / 그것은 충돌 :)이 DB의 위치로 돌아 올 것이다 선수 위치
미 콜라이 Marcisz

-2

플로트? 3D 게임에는 3 개의 수레가 있습니다. 적어도 우리에게는 피트를 단위로 사용하므로 플로트 노이즈가 문제가되지 않는 지점에 소수점 3-4 자리 만 있으면됩니다. 큰 구역이 한쪽으로 1 마일 또는 2 마일이면 그다지 큰 거래는 아닙니다. MMO의 투명한 구역 설정에 관해서는 다른 질문입니다. MMO에서 어려운 문제의 큰 계획에서 저장 위치는 목록에서 매우 낮습니다.


개발 과정에서 일부 대형 STO 영역에서 부동 소수점 정밀도 문제가있었습니다. 나는 그들이 무엇이 됐는지 모른다. 최우선 순위는 아니지만 실제로 레벨을 만들려면 충분히 일찍 고려해야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.