RTSの戦略でロックステップを使用しないでください

こんにちは、Habr! RTSゲームでLockstepを使用しないという記事の翻訳を紹介ます。







ロックステップが失われました! クライアントサーバーモデルが勝ち、ほとんどのゲームの標準になりました。 リアルタイム戦略は最新のものでしたが、ロックステップの使用はますます少なくなっています。 理由を調べてみましょうが、まず、ロックステップとは何ですか?













ゲームでは、クライアントでゲームをプレイしているプレイヤーが何人かいます。 しかし、彼らが同じゲームをプレイすることをどのように確認しますか? Lockstepを使用すると、すべてのクライアントは同じパラメーターと入力データで同じコードを実行します。 たとえば、プレイヤーのいずれかが指定されたポイントに行くように軍隊に命令した場合、このチームはすべてのクライアントに転送され、このすべての軍隊が指定されたポイントに移動します。 発電機でも ランダム 擬似乱数はすべての人で同じである必要があります。通常、これはゲームの開始時に同じシードを使用し、すべてを同じ順序で実行することによって行われます。 コマンドのみが送信されるため、これはネットワークの観点から非常に効果的です。 注文やアクションのようなものは、ネットワークパケット内のスペースをほとんど占有しません。







ロックステップはネットワーク接続の非常に効果的なモデルですが、同期の問題やコンパイラ/異なるプラットフォーム間の違いのために実装が困難です。 ネットワークの帯域幅が非常に低いため、過去にロックステップが使用されていました。 これはうまくいきました。 概念的には、既存のゲームに簡単に追加できます。 たとえば、DOOMは既に作成されており、すべてが機能しています。 マルチプレイヤーを追加するには、John Carmackは各コンピューターでコマンドを実行する必要がありました。 これは、遅延やアーキテクチャの違いがすべてを損なう前に、理論的には非常に簡単です。 実際には、これを行うのは困難です。 プログラマは、すべてのコマンドが各クライアントで同じ順序で実行されることを確認する必要があります。 誰かが時間通りにチームを獲得できなかった場合はどうなりますか? クライアントは、すべてのクライアントからのコマンドの受信の確認を待つ必要があります。 誰かが再接続するとどうなりますか? 最初に頭に浮かぶのは、ゲーム全体を最初からシミュレートすることです。これにはかなりの時間がかかります。













Lockstepを使用して、プログラマーはコンパイラーが浮動小数点演算を最適化しないことを確認する必要があります。これは、同じ計算の結果、プロセッサーのアーキテクチャーによってわずかな違いがあるためです。 これは、PCとiPadを同期しようとしている場合に特に顕著です。 アーキテクチャの違いは、ロックステップにとって悪夢です。 HTML5-Javascriptを使用する場合、JITはさまざまな方法で計算を最適化できますが、小さな変更を加えると大きな変更を引き起こす可能性があります。 ロックステッププログラミング-ナイフの先端に多くの重量を保持する方法。







これで十分でない場合、Lockstepはp2pを使用して、2番目の問題をすべて継承します。 TCPを使用する場合、ファイアウォール、NAT、プロキシ、VPNなどのため、インターネットを介して2台のコンピューターを接続することはできません。 UDPを使用すると、ホールパンチが発生する可能性があります。 幸いなことに、ブラウザーはwebRTCをサポートしています 。これはUDPを介して動作し、STUNサーバーを介したホールパンチ用のAPIを備えています。 少なくともこの部分は、HTML5を使用して実行できます。







そして、クライアントサーバーモデルとは何ですか? クライアントがサーバーに参加し、サーバーがクライアントに更新を送信するのは簡単です。 できた! サーバーとクライアントは、異なる言語やプラットフォームでも異なるコードを使用できます。 サーバーはゲームを完全に制御できます。 何かを保持する必要があるナイフの先端はありません。 主な問題は、サーバーがより多くの更新を送信する必要があることです。 これは、各ユニットの動き、弾丸、ヘルスの変化を同期させる必要があるためです。 幸いなことに、ユーザーのネットワークチャネルは、プログラマの時代よりも拡大し、安価です。







RTSがロックステップを使用した理由は、チャネル幅です。 FPSでは、32人の移動に大量のトラフィックは必要ありません。 RTSでは、トラフィック1000はより多くのトラフィックを必要としますが、チャネル幅はこれを許可します。







クライアントサーバーモデルは、不正行為に対してより耐性があります。 Lockstepを使用して、各クライアントはゲーム全体に関するすべてを把握しています。 たとえば、戦争の霧はクライアントの一部であり、クライアントは実際には霧の背後にあるものを知っていますが、それを見せません。 また、誰もが各クライアントのIPとオープンを知っており、敵(マイクロDDOS)をスパムすることができます。 クライアントサーバーモデルでは、サーバーは単に霧の背後で更新を送信せず、サーバーのみが他のクライアントのIPを知っています。 もちろん、クライアントはサーバーに対してDDOS攻撃を行うことができますが、サーバーは攻撃をより簡単に阻止し、疑わしいアクティビティでクライアントをブロックできます。













サーバーの欠点は、費用がかかることです。Lockstepはサーバーを必要とせず、すべてp2pです。 サーバーをレンタルできるプロバイダーが存在するのは良いことです。 それでも高すぎる場合は、クライアントの1つで1台のサーバーを実行できます。ロックステップのように見えますが、権限のあるクライアントが1つあり、負荷が高い点が異なります。







例:







  1. StarCraft 1はロックステップを使用し、StarCraft 2はクライアントサーバーモデルを使用します。
  2. Supreme Commander 1は、Planetary Annihilationなどの新しいゲームがClient-Serverモデルを使用する場合、Lockstepを使用します。
  3. DotAはLockstepを使用するWarcraft 3エンジンで起動しましたが、ValveはDota 2のクライアントサーバーモデルを使用しました。
  4. DOOMはLockstepを使用していましたが、QuakeはClient-Serverモデルを使用しています; LockstepはFPSではまったく一般的ではありませんでした。
  5. MMOはこれほど多くのプレーヤーに適用できないため、Lockstepを使用したことがありません。


プログラミングの開発、コンピューターの安価化、およびインターネットの現代的な速度により、クライアントサーバーはロックステップよりも簡単に適用できます。 ロックステップはますます使用されなくなります。








All Articles