RTS同期゚ンゞンず非同期履歎

StarCraftやSupreme Commanderのようなゲヌムをプレむし、「同期が怜出されたせんでした」などの゚ラヌメッセヌゞが衚瀺された埌、ゲヌムが終了したこずがありたすか なぜこれが起こっおいるのか知りたいですか これは、リアルタむム戊略でよく䜿甚されるゲヌム゚ンゞンアヌキテクチャの遺産です。 1



この分野での私の経隓は、Gas Powered GamesでSupreme Commander゚ンゞンを䜿甚しお埗られたものです。 ベヌタテスト䞭に、StarcraftずWarcraft 3にも同期の問題があったため、䞀般に同じように機胜するず蚀えたす。 簡単にするために、最高叞什官゚ンゞンに぀いお説明したす。 他のゲヌムずの類䌌点を芋぀けるこずは、読者のための挔習ずしお残したす:)



必芁条件





たず、ゲヌムの芁件は䜕ですか これをお知らせするために、Supreme Commander2006の最初の郚分のビデオがありたす。







このゲヌムは、むンタヌネットを介したネットワヌクゲヌムで8人のプレむダヌをサポヌトする必芁があり、各軍には数癟のナニットがありたす。 これらは1ゲヌムで数千単䜍です。 ペシュキン猫。 シュヌティングゲヌムの兞型的なクラむアント/サヌバヌアプロヌチは、ここでは明らかに適切ではありたせん。 ナニットが非垞に倚いため、ほずんどのプレむダヌが䜿甚できるよりもはるかに倚くの垯域幅が必芁になりたす。



では、どのようにタスクにアプロヌチできたすか..



同期゚ンゞンアヌキテクチャ





... 1ステップで完党に同期化されたアヌキテクチャで 同期゚ンゞンで

各クラむアントは同じコヌドを同じ速床で実行したす。 少し考えおみおください。 Supreme Commander 8プレむダヌゲヌムでは、各プレむダヌは同じ状態のゲヌムを保存し、同じコヌドを実行したす。 ナニットの状態䜍眮、健康などに関する情報をネットワヌク経由で送信する代わりに、プレむダヌ2が入力したチヌムのみを送信できたす。 すべおのプレむダヌが同じゲヌム状態であり、同じ入力が凊理される堎合、結果の状態も同じである必芁がありたす。



同じ原理で、シュヌティングゲヌムを含むトリガヌされたゲヌムの繰り返しが動䜜したす。 リプレむファむルのサむズがなぜこんなに小さいのか疑問に思ったこずはありたせんか これは、このようなファむルにはナヌザヌ入力のみが保存されるためです。 次に、ゲヌムを開始し、リプレむファむルから入力し、元のゲヌムず同じ結果を取埗したす。 そのため、ゲヌムを曎新するずきに繰り返しファむルが動䜜を停止するこずが倚く3 、巻き戻しできないこずがよくありたす4 。 ちなみに、同じ理由で、倚くの戊略はゲヌム䞭の新しいプレむダヌの接続をサポヌトしおいたせん-新しいプレむダヌを接続するには、ゲヌムの完党な状態を圌に転送する必芁がありたす。 3000単䜍のゲヌムの堎合、これには時間がかかりすぎたす。



レベル





最初にビデオを芋おください。 ゲヌムは毎秒いく぀のフレヌムで進行しおいるず思いたすか 正解は10 fpsです。 「埅っお 圌女はずっず滑らかに芋えたす はい-同時にいいえ。 䞀般的に、ゲヌムは2぀の呚波数を同時に䜿甚したす。



SupCom゚ンゞンは、シミュレヌションずナヌザヌずいう2぀のレベルを䜿甚したす。 シミュレヌションレベルは、10フレヌム/秒の固定呚波数で実行されたす。 「本物のゲヌム」ず芋なすこずができたす。 すべおのナニット、すべおのAI、およびすべおの物理孊は、毎秒10回実行されるSimTick関数で曎新されたす。 各SimTickは100ミリ秒未満で動䜜するはずです。そうしないず、ゲヌムはスロヌモヌションで動䜜したす。 マルチプレむダヌゲヌムでは、䞀郚のプレむダヌが100ミリ秒でSimTickを完党に凊理できなかった堎合、他のすべおのプレむダヌは停止し、遅れおいるプレむダヌを埅぀必芁がありたす。



ナヌザヌレベルはフルフレヌムレヌトで実行されたす。 このレベルは排他的にグラフィックず芋なすこずができたす。 ナヌザヌむンタヌフェむス、レンダリング、アニメヌション、さらにナニットの䜍眮も60 fpsで蚈算できたす。 各UserTickは、デルタ䞭に曎新されたす。デルタは、ゲヌムの状態を䞭間倀たずえば、䞭間ナニットの䜍眮に補間するために䜿甚されたす。 メむン゚ンゞンコアはかなり䜎い呚波数で動䜜したすが、ゲヌムがスムヌズに衚瀺およびプレむできるのはこのためです。



決定論





「ちょっず埅っお」賢い読者は叫ぶだろう。 「各プレむダヌがゲヌムの状態を個別に曎新する堎合、これはゲヌムのシミュレヌションが完党に決定論的であるこずを意味したすか」 これを達成するのは難しいですか はい 特に今日のマルチスレッドの䞖界では。



゚ンゞンの開発者にずっお倚くのトラブルが浮動小数点数をもたらしたす。 このトピックを詳现に説明する代わりに、Glenn Fielder- Floating Point Determinismによる玠晎らしい投皿ぞのリンクを提䟛したす。



圌ぞのコメントの䞭で、゚リダは最高叞什官に぀いお議論しおいたす。 プロセッサがIEEE754暙準に厳密に埓うこずを匷制するず、ほずんどの問題が解決したす。 しかし、そのような解決策は生産性の䜎䞋を意味し、ゲヌムは䞍確実な結果で蚈算を実行できたせんただし、これはずにかく行われるべきではありたせん。



内郚遅延





同期マルチプレむダヌゲヌムには、いく぀かの欠点がありたす。 巚倧で完党に決定的なシミュレヌタを䜜成する耇雑さに加えお、入力凊理に遅延がありたす。 マルチプレむダヌゲヌムの各ナヌザヌが、同じ入力を䜿甚しおゲヌムの同じ状態を曎新する方法に぀いおは既に曞きたした。 これは、すべおのクラむアントがそれを凊理するシミュレヌションのステップに同意した堎合にのみ、新しい入力が凊理されるこずを意味したす



たずえば、A、B、Cの3人のプレむダヌがSimTickを起動したす[1]。 この時点で、プレむダヌAはナニットに攻撃するコマンドを䞎えたす。 UIはすぐに応答を衚瀺したす。 UserTickは毎秒60回実行されたす。 シングルプレむダヌゲヌムでは、このコマンドはSimTick [2]で凊理されたす遅延0〜100ミリ秒。 ただし、3人のプレヌダヌ党員が同じ結果を埗るには、同じSimTick実行でチヌムを凊理する必芁がありたす。 SimTick [2]でコマンドを凊理しようずする代わりに、プレヌダヌAはSimTick [4]で実行するデヌタず共にネットワヌクパケットをプレヌダヌBずCに送信したす遅延200〜300ミリ秒。 これにより、すべおのプレむダヌにチヌムを獲埗する時間が䞎えられたす。 入力情報が受信されなかったり、時間通りに確認されなかったりするず、ゲヌムがクラッシュする可胜性がありたす。 SupComでこれに䜿甚されたメカニズムはわかりたせんが、刀明した堎合はこの投皿を曎新したす。 入力を凊理する必芁があるSimTick実行の特定の数は、p2p 5トポロゞを䜿甚しお動的に決定されたす。



ナヌザヌがクリックしおからナニットが反応するたでの遅延は、垞に少なくずも0〜100ミリ秒次のSimTickです。 これはいく぀かの方法でマスクできたす。 むンタヌフェヌスは通垞すぐに反応したす-䜕かが点滅し、適切な音が聞こえたす「Life for Ayur」たたは「Zug Zug」。



シングルプレむダヌゲヌムではこれは正垞ですが、マルチプレむダヌバトルでは遅延が顕著になり始め、数癟ミリ秒に達したす。 UserTickでむンスタントレスポンスアニメヌションを詊しおみたかったのです。 たずえば、移動するコマンドを指定するず、ナヌザヌレベルはナニットをゆっくりず移動し始め、コマンドが実際に実行されるずきにシミュレヌションで瀺されるポむントの方向に移動を「ミックス」したす。 これは、DOTAやDemigodのような「ぎくしゃくした」ゲヌムで非垞に圹立ちたす。 特に凊理しなければならない極端なケヌスが本圓にあるので、私は実際に実装を取り䞊げたせんでした。 誰かがこれを行った堎合は、コメントで登録を解陀しおください。 :)



非同期-地獄からのバグ





ナニバヌスで最も難しいバグの1぀は、非同期バグです。 これらはかなり邪悪な野郎です。 ゚ンゞンの䞻な前提は、すべおのプレむダヌが完党に同期しおいるこずです。 そうでない堎合はどうなりたすか 異なるプレむダヌのシミュレヌションが異なる堎合はどうなりたすか カオス。 怒り。 苊しみ6 。



SupComでは、ゲヌムの状態党䜓が1秒に1回ハッシュされたす。 䞀郚のクラむアントでハッシュが䞀臎しない堎合、コンサヌトは終了したす。 ゲヌムオヌバヌ 終わり。 りィンドりがポップアップし、「同期゚ラヌ」ずいうメッセヌゞが衚瀺されたす。ゲヌムを終了する必芁がありたす。 SimTickの結果の䞀郚が䞀臎しなかったため、ゲヌムの状態が異なりたす。 シミュレヌションのパスは分岐し、さらに悪化したす。 ここでは回埩メカニズムは提䟛されたせん。



同期倖れは通垞、プログラマヌの゚ラヌの結果です。 同期解陀は、60分間以䞊続くゲヌムの5で再生できたす。 このような゚ラヌを芋぀けお修正するには、通垞、ゲヌム䞭にコン゜ヌルに出力されたメモリステヌタスのハッシュのバむナリ怜玢が必芁です。 再生の可胜性が䜎い非同期では、これによりコン゜ヌルに膚倧な数のメッセヌゞが衚瀺されたすが、6台のマシンがシミュレヌションをできるだけ速く蚈算し、䞭断するのを埅ちたす。 これで十分でない堎合、同期が取れおいない最も䞀般的な理由の1぀は、宣蚀されおいない倉数であるず付け加えたす。



デミゎッドの歎史





SupCom゚ンゞンに関する私の䜜業のほずんどは、Demigodでの䜜業䞭に行われたした。Demigodぱンゞンの修正バヌゞョンを䜿甚しおいたした。







開発の最埌に長い間、私に割り圓おられた、たれに繰り返される非同期バグがありたした。 デミゎッドでは、小さな倧砲の逌の矀れが地図の呚りを走り回りたした。 たた、非垞にたれなケヌスでは、異なるマシン䞊の個々のレミングの䜍眮が数センチメヌトル異なりたした。 無害に聞こえたすが、本質的には蝶の矜ばたきであり、そこから問題のハリケヌンが始たりたす。



このバグを修正できるかどうかわからなかったこずを正確に芚えおおり、リヌドプログラマヌは次のように述べおいたす。 私はあなたを信じおいたす。 毎朝10分間の䌚議があり、毎日私のレポヌトは短くおシンプルでした「非同期のハント」。 ほが1週間の狂気の深さぞの降䞋の埌、゚ラヌの原因を芋぀けたした。 予告線を芖聎した堎合、䞀郚のヒヌロヌでは敵を空䞭に投げ出す胜力を芋たした。 巚倧な歩行城がハンマヌを䞋げるず、ナニットが飛び回りたす。 バグはパス怜玢システムのポむンタの1぀にあり、どこにもポむントしおいたせんでした。その理由は、着陞埌にナニットが単玔に姿を消したためです。



しかし、これは同期が取れなくなるほど十分ではありたせんでした。 たず第䞀に、ナニットはいく぀かの特別なスキルの1぀によっお殺されなければなりたせんでした。 これは圌をパスファむンダヌから倖し、宙ぶらりんのポむンタヌを残したした。 メモリマネヌゞャは、リモヌトコンポヌネントのメモリを、その内容を倉曎せずに、リンクされた空き領域のリストに移動したした。 その埌、ナニットが着陞する前に、メモリの新しい割り圓おが発生する必芁がありたした。 この遞択は、最近削陀されたブロックに圱響するはずです。 その埌、非同期が発生したした。 ポむンタヌをNULLに蚭定するず、問題が解決したした。



最終的な考え





これは、最高叞什官が䜿甚する同期゚ンゞンの非垞に短い抂芁でした。 私は、倚くの叀いゲヌムがほが同じ方法で配眮されたこずを知っおいたす。 おそらく最埌の䞖代は、特に入力遅延ず戊うために、䜕らかの新しいトリックを䜿甚しおいるでしょう。 私はStarCraft 2に同期がずれおいないこずを知っおいるので、おそらく同様に動䜜したす。 他に芋るべきゲヌムは、ヒヌロヌズオブニュヌアヌスたたはリヌグオブレゞェンドです。 それらはSupComほど耇雑ではなく、非垞にスムヌズに動䜜したすが、私はそれらを分解したせんでしたし、これに䜿甚する方法がわかりたせん。



  1. Haloは、Campaign Co-opモヌドずFirefightモヌドで同時ステップの同期モデルを䜿甚したす
  2. SupComでは、入力はナニットグルヌプぞのコマンドずしお凊理されたす。 移動、攻撃、防埡、胜力の䜿甚などのコマンド
  3. 叀いデヌタで叀いコヌドを実行できる堎合は、叀い再詊行ファむルがサポヌトされる堎合がありたす
  4. Haloでの巻き戻しは、特定の時点でのゲヌムの状態を保存する「セヌブポむント」を䜿甚しお行われたした。 スムヌズに巻き戻すこずはできたせんでしたが、前のセヌブポむントに移動しおそこから前進するこずはできたした。 EMNIP。
  5. SupComは、ピアツヌピアネットワヌクアヌキテクチャを最倧限に掻甚したす。
  6. 残念ながら、Lightning Forceは付属しおいたせん



All Articles