現代の多人数参加型ゲームでは、環境のような巨大で静的なオブジェクトがサーバーからクライアントに送信されますか?

私は権威あるシステムを持っています、そこではプレーヤーが試合に参加するとき、それはすべてのすでに生み出されたオブジェクトを得ます - それ自身(クライアント)で生み出されます。

それはこのように見えます:

  1. Client sends the access token to the Server
  2. Client receives the acceptance from the Server
  3. Client switches scene to the game scene
  4. Server sends players, crates, objects you can interact with so the client can spawn and display them.

しかし、地上物はどうですか? 今のところ、サーバとクライアントではまったく同じシーンがあります。1つの静的なプレーンがフロアとして機能します。現在、私は新しいもの、木、階段を追加して、そしてものを一緒に構築しています。

私は思った - 私たちは元気です。しかし、環境も同期させるべきではないでしょうか。どういうわけかネットワークにつながっている?サーバーによって所有されている?

League of Legends を見てみましょう。

enter image description here

それは静的な環境です、おそらく1つの複合メッシュ(階段、草、壁、店)。しかし、それは本当にクライアントに保存されているのでしょうか、それともロード中にサーバーから送信されたのでしょうか。

18
あなたはリーグキャラクターや環境にカスタムスキンを追加できるという点からそれについて考えることさえできます。サーバーに送信するのではなく、ローカルに表示されるので、ローカルに保存されレンダリングされるという結論に達するのは理にかなっています。また、それらはゲームプレイに影響を与えません、あなたが衝突について尋ねているならば、それらはサーバーとクライアントの混在です、そのためプレーヤーはカンニングできず、壁を通り抜けられません。
追加された 著者 rgeorge,

5 答え

ほとんどの場合、いや、どんな種類のアート資産も日常的にネットワークを介して送信されません。通常、すべてのクライアントが同じコンテンツアセットをローカルに持ちます。これを、コンテンツのチェックサムなどを介して確認するためのコードがあるかもしれません。ユーザーがクライアント側のコンテンツをクライアント側で改ざんすることに不安がある場合は、同様のシステムを実装できます。

サーバーは、特定の資産を表示または非表示にするよう指示する指示をクライアントに送信することがありますが、資産の実際のデータは送信しません。これは、実際には、無駄で遅すぎ、利用可能なデータが限られている人々に本当の問題を引き起こす可能性があります。

場合によっては、アセットが「ネタバレ」などと見なされると、小さいアセットが全体に渡ってストリーミングされることがあります。しかし、それは珍しいことです。通常、ゲームはパッチから新しいコンテンツなどをダウンロードする可能性がありますが、起動時のパッチ適用プロセス中に一度だけ発生します。ゲームプレイ中ではありません。

41
追加された
@ hoffmaleはい、いい点です。最後の時点では景観は静的であるとの質問がありましたので、その点を上げることは考えていませんでしたが、それは良いことです。
追加された 著者 Eric Goodwin,
この回答は静的なアセットのみを対象としていることに注意してください。動的/プレイヤーが生成したアセット(例:Minecraftのワールドチャンク、プレイヤーがアップロードできるMMORPGギルドのロゴ)を送信する必要があります。しかしそれでも、必要なデータ量を最小限に抑えようとする(Minecraftの例を続けるために:ブロックタイプ/状態と変更された座標のみを示す、チャンク全体の代わりにブロック更新を送信する) 。
追加された 著者 dpa,
資産がネタバレである場合、通常、資産はクライアント上にあり、暗号化されており、復号鍵は資産が必要になったときにサーバーからクライアントに送信されます。
追加された 著者 Maxime,
また、たとえば、木の座標をクライアントに送信するのではなく、木をランダムにマップに配置する必要がある場合は、(乱数ジェネレータの)シードをクライアントに送信します。
追加された 著者 Maxime,

ゲームの種類など、いくつかの要因に依存します(ここではRTSを想定しますが、オープンワールドのMMOも頭に浮かんでいます)。基本のローカル対プレイヤー地形状態は、接続時に送信されるか、クライアントの資産の一部になります。マップがクライアントに付属しているか、ゲームの開始前にダウンロードされるRTSゲームを考えてください。

実際、ほとんどのRTSのケースではすでにメッシュがクライアントにあるため、通常はメッシュは送信されません。 2つを同期させるのに本当に重要な衝突マップが送信されるかどうかが、別の問題です。しかし、ほとんどのRTSでは、これもまたクライアントに事前に保存されます。

実際、RTSに同梱されているもの、プレイする前にマップをダウンロードするか、ゲームの開始時にマップをダウンロードするかは、すべて異なります。

その後、同期を保つためのいくつかの典型的な方法があります。

  • デルタはクライアントに送信されます - ローカル/クライアントの世界をサーバーで最新に保つ最も一般的で効率的な方法です。
  • 世界の状態が確実に一致するように、チェックサムがサーバーからクライアントへ、またはクライアントからサーバーへ送信されることがあります。
  • 場合によっては、完全な状態でクライアントを再同期することに憤慨しています - 多くの場合、浮動小数点ドリフトなどの技術的な問題の結果です。
5
追加された

尋ねられた正確な質問に関して、League of Legendsが具体的にどのように処理しているのかわかりません。私はそのゲームをプレイしたことがないので、それが必要かどうかを示唆することはできません。

しかし、あなたの質問に対する答えは、一般的に、かなり単純明快です。

If the data is static, and you know for sure that it will never change (short of periodic full-game-updates, but that's separate), then why would you ever want to send that extra data? Usually you try to avoid sending whatever can be avoided. Only send data if that communication is a need.

一方、データが時間の経過とともに変化する場合、またはそのオプションを開いたままにしたい場合は、実際に何か問題がありますか。この場合は、データを送信する必要があります。 そうでなければ、クライアントは必要なものを持っていません。

これは、地形データだけでなく、すべてのネットワーク通信に適用されます。 すべて

4
追加された

いいえ

私はLeague of Legendsのソースを掘り下げることについて公正なことをしました、そしてチャンピオンモデル、Shopkeeper、一般的な地図の背景、そして毛羽立ちのある生き物を含んでいます川はクライアント側にあります。クライアントがこれらすべてのモデルを持っているという事実は、LoLが数ギガバイトの大きさである理由の1つです。

これらすべてのデータをサーバーからクライアントに転送することは地獄のようになります。帯域幅の使用を介したやり方は、次のゲームにすべてやり直すためです。

それでは、それはどのようにして解決されるのでしょうか。各プレーヤーは、ゲーム内の他の プレーヤーにとって重要なデータのみをサーバーに送信するだけです。 Qのクールダウン時間が5秒なのか、それともDeep Terror Thresh Skinがあなたのために泡を作るのかを知る必要はありません。ゲーム内で渡されるものは、Vel'KozがQをキャストした、Viktorが左に移動した、などのようなものです。

もっと明確に言うと、画面をロードすることに関して、あなたが思いついたように、ゲームが始まる前にすべてのプレイヤーが暴動のサーバーと話す必要があるミッドパッチパッチ、安全な接続ハンドシェイク、そして不正防止プロトコルのようなものがあります。

注意:

あなたがクライアントが持っているものを見回したい、そしてそれ故に、サーバがあなたに合格しないならば、C:\ Riot Games \ RADS \ lol_Game_Client \ Projectsフォルダを見つけてください(それは少しオフかもしれません、私を許してくださいm今メモリから作業中)と.RAFファイルアンパッカーオンラインで見つけます。それからあなたはスクリーンのしぶきや肌の質感、さらにはチャンピオンの骨組みをロードするようにローカルに収容されているすべてのものを見ることができます。

2
追加された
これを実装するための明白な方法は、クライアントが(専用のアセットサーバーから)まだローカルに保存していないアセットを要求し、それを受け取ると、それらを(半)永続的にそのアセットに追加することです。ディスク上のローカル永続ストア。こうすることで、アセットは一度だけダウンロードされ、実際に必要なときにのみダウンロードされます。 (それがうまくいったら、最適化はクライアントのローカルストアに必要とされる可能性が非常に高いアセットを事前設定することです。これはゲームのインストーラパッケージを大きくするという犠牲を払って、最初の接続でのゲームの起動時間を減らすでしょう)
追加された 著者 user104319,
@AnthonyGrist League of Legendsのような多くのゲームでは、対戦相手を見つけるためにキューに参加する前にすべてのゲームアセットをダウンロードする必要があります。これは、大きな資産が機能するのを待つ間にゲームが遅れるよりはるかにうまく機能します。この種類のゲームでは、プレーヤーは10ミリ秒のpingの短縮にわくわくし、50ミリ秒未満のpingで遊んでいて、それが100から150の範囲にジャンプしたかどうかを知ることができます。ゲーム中にアセットを取得するのを待つのは、MOBAまたはFPSでの惨事でしょう。もしそれが間違った時に起こったのであれば、ゲームの結果を変える可能性さえあります。
追加された 著者 Moataz Elmasry,
@AnthonyGrist(続き)私はあなたがこのようにそれについて考えることができると思います。多人数参加型/競合型ゲームの中には、更新とキューへの入場をクライアントに世話をさせることによって、プレイヤーはよりリアルタイムのゲームプレイ体験のために、より長いロード/パッチ適用/インストール時間を交換するものがあります。これにより、アセットを必要とする特定のプレイヤーだけが、事前に作成されたパーティーに参加することを望んでいない限り、待機する必要があります。
追加された 著者 Moataz Elmasry,
@JeremyFriesnerなぜそれが明らかな方法だろうか?これは、この記事で概説している現在の実装よりも悪く聞こえます。この実装では、必要なときにすぐに利用できるように、すべての資産を事前にインストールします。シングルプレイヤーゲームでは問題ないかもしれませんが、プレイ中に新しいアセットがダウンロードされるのを常に待つよりも、インストール時間を長く(そしてディスク容量の使用量を増やす)することを望む人が多いと思います。
追加された 著者 user98166,
マルチプレイヤーゲームの場合絶対災害です。一人の人が今まで必要としなかったアセットをダウンロードする必要があるため、他のプレイヤー全員がゲームを開始するのを待たせたくありません。
追加された 著者 user98166,

これが行われていなかった例としては、Elder Scrolls Onlineが挙げられ、クライアントは地上レベルの高度について信頼していました。

金採掘者は地面を数フィート下げた。その後、彼らは地形の下を歩き回り、PCから見られたりNPCに攻撃されたりすることなく、下から資源を採掘することができました。

同様の編集により、崖を滑らかにすることができ、崖を登ったり、静止した壁の下に移動したり、すべての静止したオブジェクトを見たりすることができます。

基本的に、サーバーはプレーヤーの場所についてクライアントを信頼していました。すべての静的データに対するすべての単一プレーヤーのサーバー側での衝突を計算するのはかなり重いものになります。

しかし、Furcadiaのようなタイルベースのゲームでは違います。移動するすべての広場にサーバーサイドの移動性があり、サーバーはクライアントを信頼する必要はありません。サーバーはすべての移動とユーザー操作を認識して検証します。サーバーが結果を通知したときにのみ、クライアントはアクションを表示します。

1
追加された
TL; DR:クライアントは嘘をついていて、不正をしていると常に考えています。しかし、すべてをサーバーで検証すると、容量が低下します。
追加された 著者 Draco18s,