Megapack: Factorio が 200 人のプレむダヌによるマルチプレむダヌの問題をどのように解決したか

Megapack: Factorio が 200 人のプレむダヌによるマルチプレむダヌの問題をどのように解決したか
今幎のXNUMX月に遞手ずしお出堎したした。 キャサリンオブスカむ MMO むベント。 プレむダヌの数が䞀定の数に達するず、数分ごずに䜕人かが「脱萜」するこずに気づきたした。 あなたにずっお幞運なこずに私にずっおはそうではありたせんでしたが、私もそうしたプレむダヌの䞀人でした 毎回接続が良奜であっおも。 私はこれを個人的な課題ずしお捉え、問題の原因を探し始めたした。 XNUMX 週間のデバッグ、テスト、修正を経お、最終的にバグは修正されたしたが、その道のりはそれほど簡単ではありたせんでした。

マルチプレむダヌ ゲヌムの問題は远跡するのが非垞に困難です。 これらは通垞、非垞に特殊なネットワヌク パラメヌタヌおよび非垞に特殊なゲヌム状態 (この堎合は 200 人を超えるプレむダヌ) で発生したす。 たた、問題を再珟できたずしおも、ブレヌクポむントを挿入するずゲヌムが停止し、タむマヌが狂い、通垞はタむムアりトにより接続がタむムアりトするため、問題を適切にデバッグするこずはできたせん。 しかし、忍耐力ず、ずいう玠晎らしいツヌルのおかげで、 䞍噚甚な 䜕が起こっおいるのかを理解するこずができたした。

぀たり、バグずレむテンシヌ状態シミュレヌションの䞍完党な実装が原因で、クラむアントは、400 クロック サむクルで玄 200 のゲヌム ゚ンティティのプレヌダヌの入力遞択アクションで構成されるネットワヌク パケットを送信しなければならない状況に陥るこずがありたした (これを「メガパケット」ず呌びたす)。 サヌバヌは、これらの入力アクションをすべお正しく受信するだけでなく、他のすべおのクラむアントに送信する必芁がありたす。 クラむアントが XNUMX 瀟ある堎合、これはすぐに問題になりたす。 サヌバヌぞのリンクがすぐに詰たり、パケット損倱ず再芁求パケットのカスケヌドが発生したす。 入力アクションが遅延するず、さらに倚くのクラむアントがメガパケットを送信するこずになり、雪厩がさらに倧きくなりたす。 幞運なクラむアントはなんずか回埩したすが、他のクラむアントはすべお萜ちおしたいたす。

Megapack: Factorio が 200 人のプレむダヌによるマルチプレむダヌの問題をどのように解決したか
この問題は非垞に根本的なもので、修正するのに 2 週間かかりたした。 かなり技術的なので、以䞋で重芁な技術的な詳现を説明したす。 しかしたず、0.17.54 月 4 日にリリヌスされたバヌゞョン XNUMX 以降、䞀時的な接続の問題はあったものの、マルチプレむダヌはより安定しおおり、遅延の非衚瀺のバグは倧幅に枛少しおいたす (ブレヌキやテレポヌトが枛少しおいたす) こずを知っおおく必芁がありたす。 たた、戊闘の遅延を非衚瀺にする方法を倉曎したした。これにより、遅延が少しスムヌズになるこずを願っおいたす。

マルチプレむダヌ メガ パック - 技術的な詳现

簡単に蚀うず、ゲヌムのマルチプレむダヌは次のように機胜したす。すべおのクラむアントは、プレむダヌの入力 (「入力アクション」ず呌ばれる) のみを送受信するこずによっお、ゲヌムの状態をシミュレヌトしたす。 入力アクション。 サヌバヌの䞻なタスクは転送です。 入力アクション そしお、すべおのクラむアントが同じサむクルで同じアクションを実行するようにしたす。 詳现に぀いおは、投皿をご芧ください。 FFF-149.

サヌバヌはどのようなアクションを実行するかを決定する必芁があるため、プレヌダヌのアクションは次のパスに沿っお移動したす: プレヌダヌのアクション -> ゲヌム クラむアント -> ネットワヌク -> サヌバヌ -> ネットワヌク -> ゲヌム クラむアント。 これは、プレヌダヌの各アクションは、ネットワヌクを埀埩するパスを䜜成した埌にのみ実行されるこずを意味したす。 このため、ゲヌムが非垞に遅いように芋えたため、ゲヌムにマルチプレむダヌが登堎した盎埌に、遅延を隠すメカニズムが導入されたした。 レむテンシヌ隠蔜は、他のプレむダヌのアクションやサヌバヌの意思決定を考慮せずに、プレむダヌの入力をシミュレヌトしたす。

Megapack: Factorio が 200 人のプレむダヌによるマルチプレむダヌの問題をどのように解決したか
Factorio にはゲヌム状態がありたす ゲヌムの状態 マップ、プレヌダヌ、゚ンティティ、その他すべおの完党な状態です。 これは、サヌバヌから受信したアクションに基づいお、すべおのクラむアントで決定的にシミュレヌトされたす。 ゲヌムの状態は神聖なものであり、サヌバヌや他のクラむアントず異なる状態になり始めるず、非同期が発生したす。

陀く ゲヌムの状態 遅延が発生しおいる状態です レむテンシヌ状態。 これには、メむン状態の小さなサブセットが含たれおいたす。 レむテンシヌ状態 これは神聖なものではなく、プレむダヌからの入力に基づいお将来のゲヌムの状態がどのようになるかを瀺すものにすぎたせん。 入力アクション.

これを行うために、生成されたファむルのコピヌを保存したす。 入力アクション 遅延キュヌにいたす。

Megapack: Factorio が 200 人のプレむダヌによるマルチプレむダヌの問題をどのように解決したか
぀たり、クラむアント偎のプロセスの最埌では、次のような図になりたす。

  1. 申し蟌み 入力アクション すべおのプレむダヌに ゲヌムの状態 これらの入力アクションがサヌバヌから受信された方法。
  2. 遅延キュヌからすべおを削陀したす 入力アクション、サヌバヌによれば、すでに適甚されおいたす ゲヌムの状態.
  3. 消去 レむテンシヌ状態 ずたったく同じになるようにリセットしたす ゲヌムの状態.
  4. 遅延キュヌからのすべおのアクションを レむテンシヌ状態.
  5. デヌタに基づいお ゲヌムの状態 О レむテンシヌ状態 ゲヌムをプレヌダヌにレンダリングしたす。

これすべおが小節ごずに繰り返されたす。

難しすぎる リラックスしないでください、それだけではありたせん。 信頌性の䜎いむンタヌネット接続を補うために、次の XNUMX ぀のメカニズムを䜜成したした。

  • スキップされたティック: サヌバヌが刀断したずき 入力アクション 詊合の合間に凊刑されたすが、受け取らなかった堎合は 入力アクション 䞀郚のプレむダヌたずえば、遅延が増加したため、圌は埅぀こずはありたせんが、このクラむアントに「あなたの意芋を考慮しおいたせんでした」ず通知したす。 入力アクション, 次の小節に远加しおみたす。 これは、XNUMX 人のプレむダヌの接続 (たたはコンピュヌタヌ) の問題により、他のプレむダヌのマップ曎新が遅くならないようにするために行われたす。 泚目に倀するのは、 入力アクション 無芖されるのではなく、単に延期されるだけです。
  • 完党な埀埩遅延: サヌバヌは、各クラむアントのクラむアントずサヌバヌ間の埀埩遅延がどの皋床であるかを掚枬しようずしたす。 5 秒ごずに、必芁に応じお (接続の過去の動䜜に応じお) クラむアントず新しい遅延に぀いおネゎシ゚ヌトし、それに応じお埀埩遅延を増枛したす。

これらのメカニズム自䜓は非垞に単玔ですが、組み合わせお䜿甚​​するず (接続の問題でよく発生したす)、コヌド ロゞックの管理が難しくなり、倚くの゚ッゞ ケヌスが発生したす。 さらに、これらのメカニズムが機胜する堎合、サヌバヌず遅延キュヌは特別な機胜を正しく実装する必芁がありたす。 入力アクション ず呌ばれる 次のティックで移動を停止。 このおかげで、接続の問題が発生した堎合、キャラクタヌは自力で走るこずはできたせん電車の䞋など。

ここで、゚ンティティの遞択がどのように機胜するかを説明する必芁がありたす。 䌝達されるタむプの XNUMX ぀ 入力アクション ゚ンティティの遞択状態の倉化です。 これにより、プレむダヌがどの゚ンティティ䞊にマりスを移動したかが党員に通知されたす。 ご芧のずおり、これはクラむアントから送信される最も頻繁な入力アクションの XNUMX ぀であるため、垯域幅を節玄するために、占有スペヌスができるだけ少なくなるように最適化したした。 これは次のように実装されたす。各゚ンティティが遞択されるず、ゲヌムは絶察的な高粟床のマップ座暙を保存する代わりに、前の遞択からの䜎粟床の盞察オフセットを保存したす。 マりスの遞択は通垞、前の遞択に非垞に近い䜍眮で行われるため、これはうたく機胜したす。 これにより、次の XNUMX ぀の重芁な芁件が生じたす。 入力アクション 決しおスキップしおはならず、正しい順序で実行する必芁がありたす。 これらの芁件が満たされるのは、 ゲヌムの状態。 しかし、その任務以来、 レむテンシヌ状態 プレヌダヌにずっお「芋た目は十分」ではありたすが、遅延状態では満足できたせん。 レむテンシヌ状態 考慮しない 倚くの境界䟋これは、クロックのスキップず埀埩䌝送遅延の倉曎に関連しおいたす。

これがどこに向かうのかはすでに掚枬できたす。 ぀いに、メガパッケヌゞ問題の原因が芋え始めたした。 問題の根本は、゚ンティティ遞択ロゞックが以䞋に䟝存しおいるこずです。 レむテンシヌ状態、この状態には垞に正しい情報が含たれおいるずは限りたせん。 したがっお、メガパケットは次のように生成されたす。

  1. プレヌダヌで接続の問題が発生しおいたす。
  2. サむクルをスキップし、埀埩䌝送遅延を調敎するメカニズムが機胜したす。
  3. 遅延状態キュヌでは、これらのメカニズムは考慮されおいたせん。 これにより、䞀郚のアクションが途䞭で削陀されたり、間違った順序で実行されたりしお、䞍正な動䜜が発生したす。 レむテンシヌ状態.
  4. プレヌダヌには接続の問題はなく、サヌバヌに远い぀くために最倧 400 サむクルをシミュレヌトしたす。
  5. 各サむクルで、新しいアクションが生成され、サヌバヌに送信される準備が敎い、゚ンティティの遞択が倉曎されたす。
  6. クラむアントは、400 を超える゚ンティティ遞択の倉曎を含むメガパケットをサヌバヌに送信したす (たた、他のアクション: 発砲状態、歩行状態などもこの問題の圱響を受けたす)。
  7. サヌバヌは 400 個の入力アクションを受け取りたす。 単䞀の入力アクションをスキップするこずはできないため、すべおのクラむアントにこれらのアクションを実行するように指瀺し、ネットワヌク経由で送信したす。

皮肉なこずに、垯域幅を節玄するように蚭蚈されたメカニズムにより、ネットワヌク パケットが膚倧になっおしたいたした。

すべおの曎新゚ッゞ ケヌスず遅延キュヌのサポヌトを修正するこずで、この問題を解決したした。 かなり時間がかかりたしたが、簡単なハックに頌るのではなく、最終的に正しく理解するこずができた䟡倀がありたした。

出所 habr.com

コメントを远加したす