WoWなどのMMORPGに保存されているプレーヤーの位置はどのような種類の変数ですか?


18

J.カーマックがすぐにそれについて話すのを聞いた...

ソフトウェアがどのようにしてプレーヤーの位置を非常に正確に追跡し、ゾーン間でロードすることなく、マルチプレーヤー規模で、このような巨大な世界にいるのでしょうか?ネットコードを通過するデータはどのようにフォーマットされますか?

頂点がグラフィックカードのメモリにどのように保存されるかは理解できますが、マルチプレイヤーの同期に関しては、何が最適か想像できません。

回答:


26

Scott BilasはDungeon Siegeに取り組み、「The Continuous World of Dungeon Siege」という論文を書きました。Dungeon SiegeはMMOではありませんが、MMOには世界があり、彼は彼の論文でプレイヤーの位置付けについて話しています。私はそれが素晴らしい読み物であることがわかりました。関連セクションは次のとおりです。

精度の問題

エンジニアリングチームは最初から、継続的な世界がエンジンとコンテンツの設計に大きな影響を与えることを知っていました。そして、核となる問題は数値の安定性でした。原点から東に2メートル離れて編隊を組んで歩く2人のキャラクターを想像してください。ある時点で、互いからの距離は原点からの距離に圧倒され、キャラクターは「同じ場所に」いるように見えます。

浮動小数点を使用すると、原点から離れるほど精度が低下し、あらゆる種類の厄介な問題が発生する可能性があります。物事は正しく分類されず、隣接するメッシュ間に亀裂が生じ、空間が量子化し始め、猫と犬が共存し始めます。Dungeon Siegeは、明らかなパフォーマンス上の利点と、ビデオハードウェアのネイティブの精度に一致させるために、FPUを単精度モードで使用します。ただし、精度を上げても、最終的には問題を解決できませんでした。世界は信じられないほど大きくなることが計画されていたためです。

精度の問題は、他のほとんどのゲームのような統一された世界座標空間を持つことが不可能であることを意味していました。代わりに、解決策は連続した世界を一連の独立した座標空間に分割し、それらを定期的に切り替えて精度をリセットすることでした。これらの制約の中でさまざまなアイデアが試され、最終的には標準のポータルシステムのバリエーションに落ち着きました。

私たちのソリューションは、ジオメトリの各チャンク(Siege Node)が独自の座標空間を持ち、それらの隣接ノードと共有するドアを介して隣接ジオメトリに空間的にリンクされるリレーショナルノードベースの座標系で構成されます。ドアで接続されたノードの配置は、世界地図全体を表す連続グラフを形成します。このノードシステムは、FPUの精度を維持するという当初の目標から時間をかけて進化し、スペースを効率的に細分化する主要な方法となり、数え切れないほどの最適化のルートになりました。

特定のノードに対する3D位置の概念をカプセル化するには、従来の(x、y、z)ベクトルにノードID(x、y、z、node)を追加し、原点からのオフセットを表す必要がありました代わりに特定のノードの。この4タプルは、Siege Node PositionまたはSiegePosとしてカプセル化されます。後で、ノード間の方向間の比較を処理するために、SiegeRot(クォータニオン、ノード)を追加しました。

「ワールドスペースはありません」というフレーズは、チームのマントラになりましたが、それが意味することをすべての人が完全に理解するには文字通り何年もかかりました。

あなたは見ることができ、ここでダンジョン・シージの彼の論文の多くを


それは非常につまらない答えのようです!ありがとう!今日のゲームでは、gmpの整数のように手足の数字を使用するのではないかと思いました。
jokoon

3

巨大なゾーンレスの世界では、倍精度の頂点、または土地を分割する小さなチャンクを持つ浮動小数点を使用します。

各チャンクには独自の座標系があります。これらの各チャンクの境界を越えると、すべてがその座標系に変換されます。とにかく、フライトシムでそれを行う方法です。

小さなゾーンがある場合、フロートで十分だと思います。


倍精度は、すぐに大きなパフォーマンスとメモリの利点をもたらします。(x、y、z、zone)は16バイトです。(x、y、z)doublesは少なくとも24になります。それらに対して高速の計算を行うことはできず、グラフィックカードでは使用できません。

ええと、Fermiカードは倍精度を使用できます;)しかし、ええ、チャンクアプローチは、とにかく答えが示唆するものです。
ネイラー

2

実際の位置については、3つのfloatのベクトルだと思います。ただし、プレーヤーに関連付けられたゾーンインデックスもあります。(ただし、そのゾーンサーバーによって処理されるすべてのものは同じゾーンにあり、同じデータ構造である必要はないため、場所の一部ではありません。)

少なくとも4つのゾーンがあることを忘れないでください。4つの主要な大陸。それらのどれもが片側で約10km以上あるとは思いません。たとえば、このブログの前の最新の拡張では、旅行可能なエリア全体を41平方マイルとして計算しています。すべての戦場、すべてのインスタンスは、それぞれ独自のゾーン内にあり、同様に空間を調整します。

LUA APIを使用すると、プレーヤーの位置を取得できます。GetPlayerMapPosition()は、世界地図全体に沿って、それぞれ0から1までの割合で2つのフロートを返します。


1

WoWの場合、単純なfloat x / y / zを使用することを期待していますが、特定の「ゾーン」に関連しています。

これは、たとえばボートやツェッペリンなどの「移動ゾーン」の処理に役立ちます


1

通常、Wow、Tibiaなどのオンラインゲームは、プレーヤーの位置を保存します。SQlプレーヤーメタテーブルで3つの変数X + Y + Zを使用します。RunescapeはZなしでそれを行います-そのようにしてプレイヤーは常に地面メッシュの上部にレンダリングされます。


メタテーブルとは何ですか?DBに保存するのは本当に疑わしいです。リアルタイムで使用する必要があります
...-jokoon

(1)その場合のメタテーブルは、基本的な文字データを含むDBテーブルです。性別、ポジションxyz、健康の量、銀行の現金など、その他の可能性があるもの。(2)私はオープンTibiaサーバーをホストしていますが、そこではプレーヤーのposはサーバーキャッシュに保存されています。しかし... 30秒ごとにサーバーが保存され、プレーヤーのPOSがプレーヤーのメタデータに追加されます。サーバーがシャットダウン/クラッシュした場合、プレーヤーの位置はDBの位置に戻ります:)
ミコラージマルシス

-2

フロート?さて、3Dゲーム用の3つのフロートの配列。少なくとも私たちは足を単位として使用しているため、浮動小数点ノイズが問題にならないポイントに必要なのは小数点以下3〜4桁です。大きなゾーンが1マイルまたは2マイルしかわからない場合、それほど大きな問題ではありません。MMOの透明なゾーニングに関しては、まったく別の質問です。MMOの難しい問題の大規模なスキームでは、リスト内の格納位置はかなり低くなっています。


開発中に大規模なSTOゾーンの一部で浮動小数点精度の問題が発生しました。それらがどうなったのか分かりません。それは最優先事項ではないかもしれませんが、実際にレベルを作るために十分に早く検討される必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.