環境のような巨大で静的なオブジェクトは、最新のマルチプレイヤーゲームでサーバーからクライアントに送信されますか?


18

信頼できるシステムがあり、プレーヤーが試合に参加すると、既にスポーンされたすべてのオブジェクトを取得します-それ自体(クライアント)でスポーンされます。

次のようになります。

  1. Client アクセストークンを Server
  2. Client から受け入れを受け取ります Server
  3. Client シーンをゲームシーンに切り替えます
  4. Serverプレイヤー、クレート、やり取りできるオブジェクトを送信して、clientそれらを生成して表示できるようにします。

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

私は思った-私たちは良いです。しかし、環境も同期すべきではありませんか?どういうわけかネットワーク化されていますか?サーバーが所有していますか?

取りましょうLeague of Legends

ここに画像の説明を入力してください

静的な環境で、おそらく1つのメッシュ(階段、草、壁、店)を組み合わせたものです。しかし、それは本当にクライアントに保持されているのですか、それともロード画面の間にサーバーによって送信されたのですか?


1
リーグキャラクターや環境にカスタムスキンを追加できるという点から考えることもできます。それらをサーバーに送信するのではなく、ローカルに表示されるため、ローカルに保存およびレンダリングされるという結論に達するのは理にかなっています。また、ゲームプレイには影響を与えません。衝突について質問している場合、サーバーとクライアントが混在しているため、プレイヤーはチートして壁を通り抜けることができません。
率直な月_Max_

回答:


41

ほとんどの場合、いや、あらゆる種類のアートアセットが定期的にネットワーク経由で送信されることはありません。通常、すべてのクライアントはローカルに同じコンテンツ資産を持ちます。コンテンツのチェックサムなどを介してこれを確実にするコードが存在する場合があります。ユーザーがコンテンツの一部をクライアント側で改ざんすることを心配している場合は、同様のシステムを実装できます。

サーバーは、特定のアセットを表示または非表示にすることを示すディレクティブをクライアントに送信する場合がありますが、アセットの実際のデータは送信しません。これは、実際には無駄が多く、時間がかかりすぎて、利用可能なデータが限られている人々に本当の問題を引き起こす可能性があります。

特定のケースでは、資産が何らかの形で「ネタバレ」と見なされる場合、小さな資産全体がストリーミングされる場合があります。しかし、それは珍しいことです。一般的に、ゲームはパッチなどから新しいコンテンツをダウンロードする可能性がありますが、起動時のパッチ適用プロセス中に1回だけダウンロードされます。ゲームプレイ中ではありません。


21
この回答は静的アセットのみを対象としていることに注意してください。ダイナミック/プレイヤー生成アセット(たとえば、Minecraftワールドチャンク、またはプレイヤーがアップロードできるMMORPGギルドロゴ)を送信する必要があります。しかし、それでも通常、必要なデータ量を最小限に抑えようとします(Minecraftの例を続けるため:チャンク全体の代わりにブロック更新を送信し、ブロックタイプ/状態と変更された座標のみを示す)および/またはデータをクライアント側にキャッシュします。
-hoffmale

@hoffmaleはい、良い点です。質問では、風景は最後に静的であると述べたので、私はその点を上げるとは思わなかったが、それは良いものです。

3
資産がスポイラーである場合、通常、資産はクライアント上にあり、暗号化され、暗号化キーは資産が必要なときにサーバーからクライアントに送信されます。
グラントデイビス

4
また、たとえば、マップのツリーをランダムに配置する必要がある場合、ツリーの座標をクライアントに送信する代わりに、(乱数ジェネレーターの)シードをクライアントに送信します。
グラントデイビス

5

ゲームの種類など、いくつかの要因に依存します(ここではRTSを想定しますが、オープンワールドMMOも思い浮かびます)。ベースのローカルツープレイヤーテレインステートは、接続時に送信されるか、クライアントの資産の一部です。マップがクライアントに同梱されるか、ゲームの開始前にダウンロードされるRTSゲームを考えてください。

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

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

その後、同期を維持する一般的な方法がいくつかあります。

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

4

質問通りの正確な質問については、League of Legendsが具体的にどのように扱っているのかわかりません。私はそのゲームをプレイしたことがないので、必要かどうかを提案することはできません。

しかし、あなたの質問への答えは、一般に、かなり簡単で簡単です:

データが静的、データが決して変更されないことが確実である場合(定期的なフルゲーム更新以外は別ですが)、その余分なデータを送信する必要があるのはなぜですか?通常、回避できるものは何でも送信しないようにします。その通信が必要な場合にのみデータを送信します。

一方、データが時間の経過とともに変化する場合、または単にそのオプションを開いたままにする場合、問題に関して本当に選択肢がありますか?この場合、データを送信する必要があります。それ以外の場合、クライアントには必要なものがありません。

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


2

番号。

リーグオブレジェンドのソースについて掘り下げて、チャンピオンモデル、ショップキーパー、一般的なマップの背景、事実の後に追加された綿毛のクリーチャー(岩の上の小さなリスやカタツムリなど)川)はクライアント側に保持されます。クライアントがこれらすべてのモデルを持っているという事実は、LoLが何ギガバイトも大きい理由の1つです。

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

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

より明確に、ロード画面に関して、あなたがそれを持ち出したときに起こることは、ミッドパッチパッチのようなものがあります、すべてのプレイヤーはゲームが始まる前に暴動のサーバーと話し合う必要があります、安全な接続ハンドシェイク、および不正行為防止プロトコル。

注意:

クライアントが持っているものを見て回りたいので、サーバーがパスしない場合は、C:\ Riot Games \ RADS \ lol_Game_Client \ Projectsフォルダーを見つけてください(少し時間がかかるかもしれませんが、ご容赦ください) m現在メモリをオフにしています)、. RAFファイルのアンパッカーをオンラインで見つけます。次に、スプ​​ラッシュの読み込みやスキンテクスチャ、チャンピオンスケルトンなど、ローカルに格納されているすべてのものを見ることができます。


1
これを実装する明白な方法は、クライアントが(専用のアセットサーバーから)まだローカルに保存していないアセットをリクエストし、それらを受信すると、(半)永久に追加することですディスク上のローカル永続ストア。こうすることで、アセットは一度だけダウンロードされ、実際に必要なときにのみダウンロードされます。(それが機能したら、最適化は、クライアントのローカルストアに必要になる可能性が非常に高いアセットを事前に設定することです。これにより、ゲームのインストーラパッケージを大きくする代わりに、最初の接続でゲームの起動時間が短縮されます)
ジェレミーフリースナー

1
@JeremyFriesnerなぜそれが明らかな方法なのでしょうか?これは、この投稿で説明されている現在の実装よりも悪いように思えます。すべての資産を事前にインストールして、必要なときにすぐに利用できるようにします。多くの人は、プレイ中に新しいアセットがダウンロードされるのを常に待つよりも、インストール時間を長くすること(およびディスクスペースの使用量を増やすこと)を好むと思いますが、シングルプレイヤーゲームでは問題ないかもしれません。
アンソニーグリスト

2
マルチプレイヤーゲームですか?絶対的な災害。他のすべてのプレイヤーがゲームを開始するのを待たせたくないのは、一人が今まで必要なかったいくつかのアセットをダウンロードしなければならないからです。
アンソニーグリスト

1
@AnthonyGristリーグオブレジェンドのような多くのゲームでは、プレイヤーがキューに参加して試合を見つける前に、すべてのゲームアセットをダウンロードする必要があります。これは、大規模なアセットが機能するのを待つ間にゲームのラグを発生させるよりもはるかにうまく機能します。このゲームの種類では、プレイヤーはpingの10ミリ秒の短縮に興奮し、多くの場合50ミリ秒未満のpingでプレイしており、それが100から150の範囲にジャンプするかどうかを確認できます。ゲーム中にアセットを取得するのを待つことは、MOBAまたはFPSでの災害であり、それが間違った時間に発生した場合、ゲームの結果を変える可能性さえあります。
JustWannaFly

@AnthonyGrist(続き)このように考えることができると思います。一部のマルチプレイヤー/競争ゲームでは、クライアントがすべての更新とキュー入力を処理することにより、プレーヤーはより長いロード/パッチ/インストール時間をよりリアルタイムのゲームプレイ体験と引き換えます。これにより、アセットを必要とする特定のプレイヤーのみが、事前に作成されたパーティーに参加したくない限り待機する必要があり、パーティー内のすべてのプレイヤーは、対戦相手を見つけるためにキューに入るのを待つ必要があります
JustWannaFly

1

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

金採掘者は地表を数フィート下げました。その後、PCに見られたり、NPCに攻撃されたりすることなく、地形の「下」を歩き回り、下からリソースをマイニングできます。

同様の編集により、彼らは崖をなめらかにすることができたので、それらを歩いたり、静的な壁の下で削除またはルーティングしたり、すべての静的なオブジェクトを透視したりできます。

基本的に、サーバーはクライアントのプレーヤーの位置を信頼し、すべての静的に対するすべてのプレーヤーのサーバー側での衝突の計算は非常に重くなります。

ただし、Furcadiaのようなタイルベースのゲームでは異なります。移動するすべてのスクエアにはサーバー側の歩行可能性があり、サーバーはクライアントに対して何かを信頼する必要はありません。サーバーはすべての動きとユーザーアクションを認識して検証します。クライアントがアクションを表示するのは、サーバーが結果を通知したときだけです。


1
TL; DR:常にクライアントは、不正行為、嘘をついていることを前提としていノガン科を。ただし、すべてをサーバーで検証すると、容量が低下します。
Draco18s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.