初心者向けゲヌムのネットワヌクモデルに぀いお

初心者向けゲヌムのネットワヌクモデルに぀いお
ここ XNUMX 週間、私はゲヌムのオンラむン ゚ンゞンの開発に取り組んできたした。 これたでは、ゲヌムにおけるネットワヌクに぀いおたったく知識がなかったので、すべおの抂念を理解し、独自のネットワヌク ゚ンゞンを䜜成できるようにするために、たくさんの蚘事を読み、倚くの実隓を行いたした。

このガむドでは、独自のゲヌム ゚ンゞンを䜜成する前に孊習する必芁があるさたざたな抂念ず、それらを孊習するための最適なリ゜ヌスず蚘事を共有したいず思いたす。

䞀般に、ネットワヌク アヌキテクチャには、ピアツヌピアずクラむアントサヌバヌの 2 ぀の䞻なタむプがありたす。 ピアツヌピア (pXNUMXp) アヌキテクチャでは、接続されたプレヌダヌの任意のペア間でデヌタが転送されたすが、クラむアント サヌバヌ アヌキテクチャでは、プレヌダヌずサヌバヌの間でのみデヌタが転送されたす。

ピアツヌピア アヌキテクチャは䟝然ずしお䞀郚のゲヌムで䜿甚されおいたすが、クラむアント サヌバヌが暙準です。実装が簡単で、必芁なチャネル幅が小さくお枈み、䞍正行為からの保護が容易です。 したがっお、このガむドでは、クラむアント/サヌバヌ アヌキテクチャに焊点を圓おたす。

特に、私たちは暩嚁䞻矩的なサヌバヌに最も興味を持っおいたす。そのようなシステムでは、サヌバヌは垞に正しいのです。 たずえば、プレヌダヌが自分が (10, 5) にいるず思っおいるのに、サヌバヌが圌が (5, 3) にいるず告げた堎合、クラむアントはその䜍眮をサヌバヌが報告しおいる䜍眮に眮き換える必芁があり、その逆ではありたせん。 暩嚁のあるサヌバヌを䜿甚するず、䞍正行為者を認識しやすくなりたす。

ゲヌム ネットワヌク システムには XNUMX ぀の䞻芁なコンポヌネントがありたす。

  • トランスポヌト プロトコル: クラむアントずサヌバヌ間でデヌタが転送される方法。
  • アプリケヌション プロトコル: クラむアントからサヌバヌ、およびサヌバヌからクラむアントに䜕が、どのような圢匏で送信されるか。
  • アプリケヌション ロゞック: 送信されたデヌタを䜿甚しおクラむアントずサヌバヌの状態を曎新する方法。

各郚分の圹割ずそれに䌎う困難を理解するこずが非垞に重芁です。

トランスポヌトプロトコル

最初のステップは、サヌバヌずクラむアントの間でデヌタを転送するためのプロトコルを遞択するこずです。 これには XNUMX ぀のむンタヌネット プロトコルがありたす。 TCP О UDP。 ただし、それらのいずれかに基づいお独自のトランスポヌト プロトコルを䜜成したり、それらを䜿甚するラむブラリを䜿甚したりできたす。

TCPずUDPの比范

TCP ず UDP はどちらもベヌスになっおいたす IP。 IP により、パケットを送信元から受信者に送信できたすが、送信されたパケットが遅かれ早かれ受信者に到達するこず、少なくずも XNUMX 回は受信者に到達するこず、および䞀連のパケットが正しい圢匏で到着するこずは保蚌されたせん。泚文。 さらに、パケットには、次の倀で指定される限られた量のデヌタのみを含めるこずができたす。 MTU.

UDP は、IP 䞊の薄い局にすぎたせん。 したがっお、同じ制限がありたす。 察照的に、TCP には倚くの機胜がありたす。 ゚ラヌチェック機胜を備えた XNUMX ぀のノヌド間に信頌性の高い順序付けされた接続を提䟛したす。 したがっお、TCP は非垞に䟿利で、他の倚くのプロトコルでも䜿甚されおいたす。 HTTP, FTP О SMTP。 ただし、これらの機胜にはすべお代償が䌎いたす。 遅れ.

これらの関数が遅延を匕き起こす理由を理解するには、TCP がどのように動䜜するかを理解する必芁がありたす。 送信ホストが受信ホストにパケットを送信するずき、肯定応答 (ACK) を受信するこずを期埅したす。 䞀定時間が経過しおもパケットを受信しない堎合 (パケットたたは確認が倱われたため、たたはその他の理由により)、パケットを再送信したす。 さらに、TCP はパケットが正しい順序で受信されるこずを保蚌するため、倱われたパケットが受信されるたでは、たずえ受信ノヌドがすでに受信しおいたずしおも、他のすべおのパケットは凊理できたせん。

しかし、おそらくおわかりかず思いたすが、マルチプレむダヌ ゲヌム、特に FPS などのアクティブなゞャンルでは、遅延が非垞に重芁です。 そのため、倚くのゲヌムでは独自のプロトコルで UDP が䜿甚されたす。

UDP に基づくネむティブ プロトコルは、さたざたな理由から TCP よりも効率的です。 たずえば、䞀郚のパッケヌゞを信頌できるものずしおマヌクし、他のパッケヌゞを信頌できないものずしおマヌクするこずができたす。 したがっお、信頌性の䜎いパケットが受信者に届いたかどうかは気にしたせん。 たたは、XNUMX ぀のストリヌムでパケットが倱われおも他のストリヌムの速床が䜎䞋しないように、耇数のデヌタ ストリヌムを凊理するこずもできたす。 たずえば、プレヌダヌ入力甚のスレッドずチャット メッセヌゞ甚の別のスレッドが存圚する堎合がありたす。 緊急デヌタではないチャット メッセヌゞが倱われた堎合でも、緊急デヌタの入力が遅くなるこずはありたせん。 あるいは、ビデオ ゲヌム環境での効率を高めるために、独自のプロトコルが TCP ずは異なる方法で信頌性を実装する堎合もありたす。

では、TCP がダメなら、UDP に基づいお独自のトランスポヌト プロトコルを構築するこずになるのでしょうか?

もう少し耇雑です。 TCP はゲヌム ネットワヌク システムにはほが最適ではありたせんが、特定のゲヌムでは非垞にうたく機胜し、貎重な時間を節玄できたす。 たずえば、タヌンベヌスのゲヌムや LAN ネットワヌク䞊でのみプレむできるゲヌムの堎合、埅ち時間やパケット損倱がむンタヌネットよりもはるかに䜎い堎合、埅ち時間は問題にならない堎合がありたす。

World of Warcraft、Minecraft、Terraria などの成功したゲヌムの倚くは TCP を䜿甚しおいたす。 ただし、ほずんどの FPS は独自の UDP ベヌスのプロトコルを䜿甚するため、それらに぀いおは以䞋で詳しく説明したす。

TCP の䜿甚を遞択した堎合は、それが無効になっおいるこずを確認しおください ネヌグルのアルゎリズム送信前にパケットをバッファリングするため、遅延が増加したす。

マルチプレむダヌ ゲヌムのコンテキストにおける UDP ず TCP の違いに぀いお詳しくは、Glenn Fiedler の蚘事を参照しおください。 UDP ずTCP.

独自のプロトコル

独自のトランスポヌト プロトコルを䜜成したいず考えおいたすが、どこから始めればよいかわかりたせんか? Glenn Fiedler がそれに぀いお XNUMX ぀の玠晎らしい蚘事を曞いおいるので、あなたは幞運です。 それらの䞭には賢いアむデアがたくさんあるでしょう。

最初の蚘事 ゲヌムプログラマヌのためのネットワヌキング 2008幎、XNUMX回目より簡単 ゲヌムネットワヌクプロトコルの構築 2016幎。 叀いものから始めるこずをお勧めしたす。

Glenn Fiedler は、UDP に基づいた独自のプロトコルを䜿甚するこずを匷く支持しおいるこずに泚意しおください。 そしお、圌の蚘事を読んだ埌、おそらく TCP にはビデオ ゲヌムにおいお重倧な欠点があるずいう圌の意芋を採甚し、独自のプロトコルを実装したくなるでしょう。

ただし、ネットワヌクに慣れおいない堎合は、TCP たたはラむブラリを䜿甚しおください。 独自のトランスポヌト プロトコルを適切に実装するには、事前に倚くのこずを孊ぶ必芁がありたす。

ネットワヌクラむブラリ

TCP より効率的なものが必芁だが、独自のプロトコルを実装したり、倚くの詳现を怜蚎したりしたくない堎合は、ネット ラむブラリを䜿甚できたす。 それらはたくさんありたす:

すべおを詊したわけではありたせんが、䜿いやすく信頌性が高い ENet を奜みたす。 さらに、初心者向けの明確なドキュメントずチュヌトリアルも提䟛されおいたす。

トランスポヌトプロトコルの結論

芁玄するず、TCP ず UDP ずいう XNUMX ぀の䞻芁なトランスポヌト プロトコルがありたす。 TCP には、信頌性、パケット順序の保持、゚ラヌ怜出など、倚くの䟿利な機胜がありたす。 UDP にはそのすべおが備わっおいるわけではありたせんが、TCP はその性質䞊、䞀郚のゲヌムでは蚱容できない高い遅延を持っおいたす。 ぀たり、䜎遅延を確保するには、UDP に基づいお独自のプロトコルを䜜成するか、UDP 䞊にトランスポヌト プロトコルを実装し、マルチプレむダヌ ビデオ ゲヌムに適合するラむブラリを䜿甚するこずができたす。

TCP、UDP、ラむブラリのいずれを遞択するかは、いく぀かの芁因によっお決たりたす。 たず、ゲヌムのニヌズから考えたす。䜎遅延は必芁ですか? 次に、アプリケヌション プロトコルの芁件から、信頌できるプロトコルが必芁ですか? 次のパヌトで説明するように、信頌性の䜎いプロトコルが非垞に適したアプリケヌション プロトコルを䜜成するこずが可胜です。 最埌に、ネットワヌク ゚ンゞン開発者の経隓も考慮する必芁がありたす。

ヒントが XNUMX ぀ありたす。

  • すべおのコヌドを曞き盎さずにトランスポヌト プロトコルを簡単に眮き換えられるように、アプリケヌションの残りの郚分からトランスポヌト プロトコルを可胜な限り抜象化したす。
  • 過床に最適化しないでください。 ネットワヌキングの専門家ではなく、カスタムの UDP ベヌスのトランスポヌト プロトコルが必芁かどうかわからない堎合は、TCP たたは信頌性を提䟛するラむブラリから始めお、パフォヌマンスをテストしお枬定できたす。 問題が発生し、その原因がトランスポヌト プロトコルにあるず確信できる堎合は、独自のトランスポヌト プロトコルを䜜成する時期が来るかもしれたせん。

この郚分の最埌に、次の内容を読むこずをお勧めしたす。 マルチプレむダヌ ゲヌム プログラミングの抂芁 Brian Hook。ここで説明するトピックの倚くをカバヌしおいたす。

アプリケヌションプロトコル

クラむアントずサヌバヌ間でデヌタを亀換できるようになったので、どのデヌタをどの圢匏で転送するかを決定する必芁がありたす。

叀兞的なスキヌムでは、クラむアントが入力たたはアクションをサヌバヌに送信し、サヌバヌが珟圚のゲヌム状態をクラむアントに送信したす。

サヌバヌは完党な状態ではなく、プレヌダヌの近くにある゚ンティティを含むフィルタリングされた状態を送信したす。 圌がこれを行う理由は XNUMX ぀ありたす。 たず、党䜓の状態が倧きすぎお高呚波数で送信できない可胜性がありたす。 第 XNUMX に、ゲヌム ロゞックのほずんどはゲヌム サヌバヌ䞊でシミュレヌトされるため、クラむアントは䞻にビゞュアル デヌタずオヌディオ デヌタに関心がありたす。 第䞉に、䞀郚のゲヌムでは、プレむダヌはマップの反察偎の敵の䜍眮などの特定のデヌタを知る必芁がありたせん。それがなければ、パケットを嗅ぎ分けお敵を倒すためにどこに移動すればよいかを正確に知るこずができるからです。

連茉

最初のステップは、送信したいデヌタ (入力たたはゲヌム状態) を送信に適した圢匏に倉換するこずです。 このプロセスはず呌ばれたす 連茉化.

JSON や XML など、人間が刀読できる圢匏を䜿甚するずいうアむデアがすぐに思い浮かびたす。 しかし、これは完党に非効率であり、チャネルの倧郚分が無駄に占有されおしたいたす。

代わりに、よりコンパクトなバむナリ圢匏を䜿甚するこずをお勧めしたす。 ぀たり、パケットには数バむトしか含たれたせん。 ここで問題を考慮する必芁がありたす バむトオヌダヌ、コンピュヌタヌによっお異なる堎合がありたす。

デヌタをシリアル化するには、次のようなラむブラリを䜿甚できたす。

ラむブラリがポヌタブルなアヌカむブを䜜成し、゚ンディアンを考慮しおいるこずを確認しおください。

別の解決策は、これを自分で実装するこずですが、特にコヌドでデヌタ䞭心のアプロヌチを䜿甚しおいる堎合は、それほど難しくありたせん。 さらに、ラむブラリの䜿甚時に垞に可胜であるずは限らない最適化を実行できるようになりたす。

Glenn Fiedler はシリアル化に぀いお XNUMX ぀の蚘事を曞きたした。 パケットの読み取りず曞き蟌み О 連茉戊略.

圧瞮

クラむアントずサヌバヌ間で転送されるデヌタの量は、チャネルの垯域幅によっお制限されたす。 デヌタ圧瞮により、各スナップショットでより倚くのデヌタを転送したり、リフレッシュ レヌトを高めたり、単に垯域幅芁件を軜枛したりするこずができたす。

ビットの梱包

最初の手法はビット パッキングです。 これは、目的の倀を蚘述するために必芁なビット数を正確に䜿甚するこずにありたす。 たずえば、16 の異なる倀を持぀こずができる列挙型がある堎合、バむト党䜓 (8 ビット) の代わりに 4 ビットだけを䜿甚できたす。

Glenn Fiedler が蚘事の埌半でこれを実装する方法を説明しおいたす。 パケットの読み取りず曞き蟌み.

ビット パッキングは、次のセクションで説明する離散化で特に効果的に機胜したす。

サンプリング

サンプリング 倀を゚ンコヌドするために可胜な倀のサブセットのみを䜿甚する非可逆圧瞮技術です。 離散化を実装する最も簡単な方法は、浮動小数点数を䞞めるこずです。

Glenn Fiedler が (再び!) 蚘事で実際に離散化を適甚する方法を瀺しおいたす スナップショットの圧瞮.

圧瞮アルゎリズム

次の技術は可逆圧瞮アルゎリズムです。

私の意芋では、知っおおくべき最も興味深いアルゎリズムを XNUMX ぀玹介したす。

  • ハフマン笊号化 事前に蚈算されたコヌドを䜿甚するず、非垞に高速で良奜な結果が埗られたす。 これは、Quake3 ネットワヌク ゚ンゞンでパケットを圧瞮するために䜿甚されたした。
  • ZLIB は、デヌタ量を決しお増加させない汎甚圧瞮アルゎリズムです。 どうやっお芋るこずができたすか ここで、さたざたな甚途に䜿甚されおいたす。 状態を曎新する堎合は、冗長になる可胜性がありたす。 ただし、アセット、長いテキスト、たたは地圢をサヌバヌからクラむアントに送信する必芁がある堎合には䟿利です。
  • ランレングスのコピヌ はおそらく最も単玔な圧瞮アルゎリズムですが、特定の皮類のデヌタに察しおは非垞に効率的であり、zlib の前の前凊理ステップずしお䜿甚できたす。 これは、倚くの隣接する芁玠が繰り返されるタむルたたはボクセルで構成される地圢を圧瞮するのに特に適しおいたす。

デルタ圧瞮

最埌の圧瞮技術はデルタ圧瞮です。 それは、珟圚のゲヌム状態ずクラむアントが受信した最埌の状態ずの間の差異のみが送信されるずいう事実にありたす。

これは、Quake3 ネットワヌク ゚ンゞンで初めお䜿甚されたした。 その䜿甚方法を説明する XNUMX ぀の蚘事を次に瀺したす。

Glenn Fiedler も蚘事の埌半でこれを䜿甚したした。 スナップショットの圧瞮.

КОфрПваМОе

さらに、クラむアントずサヌバヌ間の情報の送信を暗号化する必芁がある堎合がありたす。 これにはいく぀かの理由がありたす。

  • プラむバシヌ/機密性: メッセヌゞは受信者のみが読み取るこずができ、他のネットワヌク スニファヌはメッセヌゞを読み取るこずができたせん。
  • 認蚌: プレヌダヌの圹割を果たしたい人は、自分のキヌを知っおいる必芁がありたす。
  • チヌトの防止: 悪意のあるプレむダヌが独自のチヌト パッケヌゞを䜜成するこずははるかに困難になりたす。暗号化スキヌムを耇補し、キヌ (接続ごずに倉曎される) を芋぀ける必芁がありたす。

これにはラむブラリを䜿甚するこずを匷くお勧めしたす。 䜿甚するこずをお勧めしたす リブナトリりム、特にシンプルで優れたチュヌトリアルがあるためです。 特に興味深いのは、次のチュヌトリアルです。 鍵亀換これにより、新しい接続ごずに新しいキヌを生成できたす。

アプリケヌションプロトコル: 結論

これでアプリケヌション プロトコルは終了です。 圧瞮は完党にオプションであり、圧瞮を䜿甚するかどうかの決定はゲヌムず必芁な垯域幅によっおのみ決たるず私は考えおいたす。 私の意芋では、暗号化は必須ですが、最初のプロトタむプでは暗号化なしでも問題ありたせん。

アプリケヌションロゞック

クラむアントで状態を曎新できるようになりたしたが、レむテンシヌの問題が発生する可胜性がありたす。 プレむダヌは入力を行った埌、サヌバヌからのゲヌム状態の曎新を埅っお、それが䞖界にどのような圱響を䞎えたかを確認する必芁がありたす。

さらに、XNUMX ぀の状態曎新の間、䞖界は完党に静的です。 状態の曎新レヌトが䜎い堎合、動きが非垞にぎくしゃくしおしたいたす。

この問題の圱響を軜枛するための手法がいく぀かありたす。それらに぀いおは次のセクションで説明したす。

遅延平滑化技術

このセクションで説明するすべおのテクニックは、このシリヌズで詳しく説明されおいたす。 ペヌスの速いマルチプレむダヌ ガブリ゚ル・ガンベッタ。 この玠晎らしい蚘事シリヌズを読むこずを匷くお勧めしたす。 これらのテクニックが実際にどのように機胜するかを確認するためのむンタラクティブなデモも含たれおいたす。

XNUMX ぀目の手法は、サヌバヌからの応答を埅たずに、入力結果を盎接適甚するこずです。 いわゆる クラむアント偎の予枬。 ただし、クラむアントがサヌバヌから曎新を受信した堎合、その予枬が正しかったこずを怜蚌する必芁がありたす。 そうでない堎合は、サヌバヌは暩嚁䞻矩的であるため、サヌバヌから受信した内容に埓っお状態を倉曎するだけで枈みたす。 この手法は Quake で初めお䜿甚されたした。 詳现に぀いおは蚘事をご芧ください。 Quake Engineのコヌドレビュヌ ファビアン・サングラヌス [翻蚳 ハブレに぀いお]。

XNUMX 番目のテクニック セットは、XNUMX ぀の状態曎新間の他の゚ンティティの移動をスムヌズにするために䜿甚されたす。 この問題を解決するには、内挿ず倖挿ずいう XNUMX ぀の方法がありたす。 補間の堎合、最埌の XNUMX ぀の状態が取埗され、䞀方から他方ぞの遷移が衚瀺されたす。 欠点は、クラむアントは垞に過去に䜕が起こったかを確認するため、遅延のごく䞀郚が発生するこずです。 倖挿ずは、クラむアントが受け取った最埌の状態に基づいお、゚ンティティが珟圚どこにあるべきかを予枬するこずです。 欠点は、゚ンティティが移動方向を完党に倉えるず、予枬ず実際の䜍眮の間に倧きな誀差が生じるこずです。

最埌の最も高床なテクニックは、FPS でのみ有効です。 ラグ補正。 ラグ補正を䜿甚する堎合、サヌバヌはクラむアントがタヌゲットで起動するずきの遅延を考慮したす。 たずえば、プレむダヌが画面䞊でヘッドショットを実行したが、実際には遅延によりタヌゲットが別の堎所にいた堎合、遅延を理由にプレむダヌの殺害の暩利を吊定するのは䞍公平です。 そのため、サヌバヌはプレヌダヌが射撃した時点たで時間を巻き戻し、プレヌダヌが画面䞊で芋たものをシミュレヌトし、射撃ずタヌゲットの間の衝突を確認したす。

Glenn Fiedler は (い぀ものように!) 2004 幎に蚘事を曞きたした ネットワヌク物理孊 (2004)で、圌はサヌバヌずクラむアント間の物理シミュレヌションの同期の基瀎を築きたした。 2014 幎に圌は新しい蚘事シリヌズを執筆したした ネットワヌク物理孊では、物理シミュレヌションを同期するための他のテクニックに぀いお説明したした。

Valve の wiki にも XNUMX ぀の蚘事がありたす。 ゜ヌス マルチプレむダヌ ネットワヌキング О クラむアント/サヌバヌのゲヌム内プロトコルの蚭蚈ず最適化におけるレむテンシヌ補償方法 遅延補償の察応。

チヌト防止

チヌト防止テクニックは䞻に XNUMX ぀ありたす。

たず、䞍正行為者が悪意のあるパケットを送信するこずが困難になりたす。 䞊で述べたように、これを実装する良い方法は暗号化です。

次に、暩限のあるサヌバヌはコマンド/入力/アクションのみを受信する必芁がありたす。 クラむアントは、入力を送信する以倖にサヌバヌ䞊の状態を倉曎できたせん。 その埌、サヌバヌは入力を受け取るたびに、入力を適甚する前にその有効性をチェックする必芁がありたす。

アプリケヌション ロゞック: 結論

クラむアントずサヌバヌが同じマシン䞊で実行されおいる堎合でも、悪い条件でゲヌムの動䜜をテストできるように、高遅延ず䜎リフレッシュ レヌトをシミュレヌトする方法を実装するこずをお勧めしたす。 これにより、遅延平滑化技術の実装が倧幅に簡玠化されたす。

その他の圹立぀リ゜ヌス

ネットワヌク モデルに関する他のリ゜ヌスを調べたい堎合は、ここで芋぀けるこずができたす。

出所 habr.com

コメントを远加したす