このホワイト ペーパーでは、Age of Empires 1 & 2 ゲームのマルチプレイヤー (ネットワーク) コードを作成するための make アーキテクチャ、実装、およびいくつかのクラスについて説明します。 また、レクリエーション エンジンで Ensemble Studios によって熟成された、ホットで将来のネットワーキング アプローチについて説明します。
エイジ オブ エンパイア のマルチプレイヤー コードが 1996 年初頭に開始されたとき、私たちが考えていたレクリエーションの専門知識を増やしたり減らしたりするために実現したいという明確な夢がいくつかありました。
Genie Engine はかつてはすでに機能しており、ゲーム シミュレーションはかつて 1 人の参加者にとって魅力的な専門知識に形作られていました。 Genie Engine は、2D シングルスレッド (レクリエーション ループ) エンジンです。 スプライトは、基本的にタイルベースの世界で 256 色でレンダリングされます。 ランダムに生成されたマップには、非常に賢く切り倒される可能性のある樹木から、跳躍するガゼルまで、何千ものオブジェクトが詰め込まれていました。 エンジンの処理義務の大まかな内訳 (最適化の実行) は、グラフィック レンダリングが 30%、AI と Pathing が 30%、シミュレーションと維持が 30% でした。 かなり初期の段階では、エンジンはある程度安定していました。マルチプレイヤー通信は、現在の (動作中の) アーキテクチャを大幅に再コーディングすることなく、現在のコードで動作することを望んでいました。 さらに複雑なことに、シミュレーションの各ステップを合計する時間は大幅に異なります。特定の人が一度ユニットを検索したり、スクロールしたり、未踏の地形の上に座ったりすると、レンダリング時間が変化し、AI による途方もない経路や戦略的計画がゲームの反転を引き起こしました。前代未聞の 200 ミリ秒ほど激しく変動します。 迅速な計算の数は、ユニットに関する膨大な知識の空間さえも通過することに平準化され、有効な時間内にそれを更新しようとすると、参加者と相互作用する可能性のあるユニットとオブジェクトの決定が大幅に制限されます. 実際の X 座標と Y 座標の通過、移動、移動、通過、傷は、ゲーム内で最大 250 ユニットの移動にほとんど関係ありません。 かつて三段櫂船で海から包囲されていたギリシャの都市を、一方の面にカタパルト、射手、戦士で荒廃させたかったのです。 明らかに、以前はもう 1 つのシステムが必要でした。 同時シミュレーションゲーム内の各ユニットの住居を渡すのではなく、ユーザーが同時に発行したコマンドの同じスペースをそれぞれ渡すことで、各マシンで有効な同一のシミュレーションを高速化することが期待されていました。 PC は、通常、最も優れた戦争映画の伝統でレクリエーション ウォッチを同期させ、熱心なゲーマーがコマンドを明確に表現できるようにし、ほぼ同じシステムを同時に使用して同じゲームを実行できるようにします。 このトリッキーな同期は、かつては基盤内での作業を救うには微妙でしたが、まったく異なる分野でいくつかの微妙な利点をもたらしました。 モデル全体の改善 最も可能性が高い概念段階では、同時シミュレーションの実現はかなり簡単に見えます。 一部のゲームでは、ロックステップ シミュレーションのささやきやゲームのタイミングの短縮が発生する可能性さえあります。 数百または数千のオブジェクトを同時に転送するスキームは、かつてこのシステムによってソートされていたため、20 ミリ秒から 1,000 ミリ秒の遅延スイングと、フレーム処理時間の変化に対処する Web 上で、静かな解決策を実行できるようにしたいと考えていました。 参加者のコマンドを送信し、すべてのメッセージを確認してから、次のフリップが発生する前にそれらを処理することは、ストップ/スタートまたは露出ターンオーバーの背後にあるゲームプレイの悪夢でした。 バックグラウンドで行われる通信を先取りしながら、ゲームを処理し続けるというプロットがかつて求められていました。 最後に 2 つの「通信ターン」を実行するタグ付けコマンドのマシンに注意してください (通信ターンは有効なレンダリング フレームから AoE で分離されていました)。 したがって、フリップ 1000 のあるレベルで発行されたコマンドは、フリップ 1002 のあるレベルで実行するようにスケジュールされます (決定 1 を参照)。 フリップ 1001 では、フリップ 0999 で発行されたコマンドが実行されます。 これにより、ゲームがかつて静かにアニメーション化し、シミュレーションを実行していたときに、メッセージを受け取り、確認し、進行することができました。 ターンは時々 200 ミリ秒のサイズになり、コマンドはフリップのあるレベルで送信されました。 200msec後に一旦フリップを止め、次のフリップを一旦開始した。 ゲームのあるレベルのどのレベルでも、コマンドは 1 回のフリップで処理され、次のフリップで取得および保存され、最後に 2 ターン実行のために送信されました。「喧噪は目を離さない」シミュレーションは有効な同じエントリを繰り返し保持する必要があるため、ゲームは実際には、最も遅いマシンが通信を処理し、フリップをレンダリングし、最新のコマンドを送信できるのと同じくらい速く実行できます。 Bustle Withhold に注意を向けることは、私たちがフリップのスケールを交換してアニメーションとゲームプレイの入札を処理し、通信速度と処理速度の変化に対処するためのマシンとして知られているものです。 実際のゲームプレイを「ラグ」と感じる要素が 2 つあります。1 つのマシンのフレーム レートが低下した場合 (または快適さよりも低下した場合)、完全に異なるマシンがコマンドを実行し、割り当てられた時間全体をレンダリングし、先を見据えて停止します。次のフリップ – 小さなストップでさえまっすぐに目立ちます。 通信が途切れる — Web の遅延と失われたレコードに起因するデータ パケットは、熱心なゲーマーがフリップを合計するのに十分なレコードデータを待っていたため、さらにゲームを停止させました。 すべてのクライアントは、フレームの決定で処理時間を平均化することにより、非常にスマートに一貫して維持される可能性があると考えられるフレームレートを計算しました。 これは、目に見える色目、ユニットの数、デザインのサイズ、およびいくつかのコンポーネントだけでなく、ゲームの過程でさまざまであるため、「Flip Done」メッセージごとに一度送信されました. さらに、すべてのクライアントは、完全に異なる購入者への丸一日の「ping 時間」を定期的に測定します。 実際には、「Flip Done」メッセージを使用して、以前に確認された最長の一般的な ping 時間を追加で送信する可能性があります。 (合計2バイトは速度調整のために一度エージングされました) 指定されたホストがフリップするたびに、「完了」メッセージを分析し、目標フレーム レートと Web レイテンシの調整を決定します。 次に、ホストは最新のフレーム レートと通信フリップ サイズを送信してエージングします。 図 3 から 5 までのレベルから、完全に異なる条件で通信フリップが一度分割された様子がわかります。 かつては大まかにメッセージの丸一日のアウト ping 時間であった「通信フリップ」は、シミュレーション フレームの決定に分割されていました。これは、一般的に、その間隔で最も遅いマシンによって非常にスマートに行われる可能性があります。 コミュニケーション フリップ サイズは、Web レイテンシの変化に対処するために急速に上昇し、アシストをゆっくりと解決して、おそらく非常にスマートに一貫して維持される可能性のある一般的な速度になるように重み付けされていました。 スポーツは、最悪のスパイクで最も有利な速度を遅らせるか、遅れる傾向があります-ゲームが最も実行可能な速度までアシストを調整したため、遅延が増加しますが、入札を処理します(フリップごとにわずか数ミリ秒調整します). これにより、状況の変化に静かに適応しながら、最もスムーズなプレイ経験が可能になりました。 提供保証ネットワーク層では、UDP は一度エージングされ、公開順序付け、タンブル検出、および再送信が各クライアントによって処理されました。 すべてのメッセージは、実行が一度スケジュールされたフリップとメッセージのシーケンス数に名前を付けるために、わずか数バイトでエージングされます。 メッセージが前のフリップで一度取得された場合、それは一度破棄され、着信メッセージは実行のために保存されました。 UDP の性質上、メッセージ受信に関する Heed の想定は、かつては「不確かな場合はハングアップする」というものでした。 メッセージが公開されていない場合、受信者はドロップされたメッセージの再送信要求を直接送信しました。 確認応答が予測よりも 1 回遅れた場合、送信者は、メッセージがドロップされたかどうかを確認するように求められることなく、実際に再送信されます。 隠れたメリットゲームの最終結果は、ユーザー全体が正確に同一のシミュレーションを実行することに依存するため、クライアント (またはクライアント ダイアログの循環) をハッキングしてチートすることは、かつては非常に巧妙でした。 別の方法で実行されたシミュレーションは、一度「非同期」としてタグ付けされ、ゲームが停止しました。 コミュニティで記録データを公開するための不正行為は、かつては静かに実行可能でしたが、これらのいくつかのリークは、その後のパッチやリビジョンでかなり簡単に安定しました。 安全性は、かつては大きな選択肢でした。 隠れた合併症ファンデーションを購入すると、同じコードを 2 つ取得して同じコードを高速化するのはかなり簡単で簡単なはずだと思われるかもしれませんが、そうではありません。 Microsoft の製品責任者である Tim Znamenacek は、Heed に早い段階で次のように語っています。 彼はかつて適切でした。 同期外れエラーをチェックする方法は、非常に微妙な変動が時間の経過とともに増加することです。 ランダムなデザインが作成された時点で、鹿の位置がずれていた場合、鹿は別の方法で鹿を採餌し、数分後、村人は少し離れた道を歩くか、槍で省略して家の肉を購入しませんでした。 そのため、完全に異なる食事の部分としてチェックサムの違いとして確認されたものには、本物のトリガーにアシストをスタンプするのが難しいトリガーがありました. 球体、オブジェクト、パスファインディング、それぞれの完全に異なるマシンに焦点を当てた全体を見ると、これまでにないほど前例のないものでした。それは、レーダーの下で事実をすり抜けていた別のことが繰り返しあったという影響を与えました。 膨大な (50MB) メッセージ トレースとワールド オブジェクト ダンプをふるいにかけることで、このスキームは前例のないほど巧妙なものになりました。 スキームの一部はかつては概念的でした – プログラマーは、シミュレーションのあるレベルでランダムへの呼び出しの同一の決定を老化させるコードを書かなければならないことに慣れていませんでした (はい、乱数はシードされ、スマートに同期されていました) )。
「喧噪は目を離さない」シミュレーションは有効な同じエントリを繰り返し保持する必要があるため、ゲームは実際には、最も遅いマシンが通信を処理し、フリップをレンダリングし、最新のコマンドを送信できるのと同じくらい速く実行できます。 Bustle Withhold に注意を向けることは、私たちがフリップのスケールを交換してアニメーションとゲームプレイの入札を処理し、通信速度と処理速度の変化に対処するためのマシンとして知られているものです。 実際のゲームプレイを「ラグ」と感じる要素が 2 つあります。1 つのマシンのフレーム レートが低下した場合 (または快適さよりも低下した場合)、完全に異なるマシンがコマンドを実行し、割り当てられた時間全体をレンダリングし、先を見据えて停止します。次のフリップ – 小さなストップでさえまっすぐに目立ちます。 通信が途切れる — Web の遅延と失われたレコードに起因するデータ パケットは、熱心なゲーマーがフリップを合計するのに十分なレコードデータを待っていたため、さらにゲームを停止させました。 すべてのクライアントは、フレームの決定で処理時間を平均化することにより、非常にスマートに一貫して維持される可能性があると考えられるフレームレートを計算しました。 これは、目に見える色目、ユニットの数、デザインのサイズ、およびいくつかのコンポーネントだけでなく、ゲームの過程でさまざまであるため、「Flip Done」メッセージごとに一度送信されました. さらに、すべてのクライアントは、完全に異なる購入者への丸一日の「ping 時間」を定期的に測定します。 実際には、「Flip Done」メッセージを使用して、以前に確認された最長の一般的な ping 時間を追加で送信する可能性があります。 (合計2バイトは速度調整のために一度エージングされました) 指定されたホストがフリップするたびに、「完了」メッセージを分析し、目標フレーム レートと Web レイテンシの調整を決定します。 次に、ホストは最新のフレーム レートと通信フリップ サイズを送信してエージングします。 図 3 から 5 までのレベルから、完全に異なる条件で通信フリップが一度分割された様子がわかります。 かつては大まかにメッセージの丸一日のアウト ping 時間であった「通信フリップ」は、シミュレーション フレームの決定に分割されていました。これは、一般的に、その間隔で最も遅いマシンによって非常にスマートに行われる可能性があります。 コミュニケーション フリップ サイズは、Web レイテンシの変化に対処するために急速に上昇し、アシストをゆっくりと解決して、おそらく非常にスマートに一貫して維持される可能性のある一般的な速度になるように重み付けされていました。 スポーツは、最悪のスパイクで最も有利な速度を遅らせるか、遅れる傾向があります-ゲームが最も実行可能な速度までアシストを調整したため、遅延が増加しますが、入札を処理します(フリップごとにわずか数ミリ秒調整します). これにより、状況の変化に静かに適応しながら、最もスムーズなプレイ経験が可能になりました。 提供保証ネットワーク層では、UDP は一度エージングされ、公開順序付け、タンブル検出、および再送信が各クライアントによって処理されました。 すべてのメッセージは、実行が一度スケジュールされたフリップとメッセージのシーケンス数に名前を付けるために、わずか数バイトでエージングされます。 メッセージが前のフリップで一度取得された場合、それは一度破棄され、着信メッセージは実行のために保存されました。 UDP の性質上、メッセージ受信に関する Heed の想定は、かつては「不確かな場合はハングアップする」というものでした。 メッセージが公開されていない場合、受信者はドロップされたメッセージの再送信要求を直接送信しました。 確認応答が予測よりも 1 回遅れた場合、送信者は、メッセージがドロップされたかどうかを確認するように求められることなく、実際に再送信されます。 隠れたメリットゲームの最終結果は、ユーザー全体が正確に同一のシミュレーションを実行することに依存するため、クライアント (またはクライアント ダイアログの循環) をハッキングしてチートすることは、かつては非常に巧妙でした。 別の方法で実行されたシミュレーションは、一度「非同期」としてタグ付けされ、ゲームが停止しました。 コミュニティで記録データを公開するための不正行為は、かつては静かに実行可能でしたが、これらのいくつかのリークは、その後のパッチやリビジョンでかなり簡単に安定しました。 安全性は、かつては大きな選択肢でした。 隠れた合併症ファンデーションを購入すると、同じコードを 2 つ取得して同じコードを高速化するのはかなり簡単で簡単なはずだと思われるかもしれませんが、そうではありません。 Microsoft の製品責任者である Tim Znamenacek は、Heed に早い段階で次のように語っています。 彼はかつて適切でした。 同期外れエラーをチェックする方法は、非常に微妙な変動が時間の経過とともに増加することです。 ランダムなデザインが作成された時点で、鹿の位置がずれていた場合、鹿は別の方法で鹿を採餌し、数分後、村人は少し離れた道を歩くか、槍で省略して家の肉を購入しませんでした。 そのため、完全に異なる食事の部分としてチェックサムの違いとして確認されたものには、本物のトリガーにアシストをスタンプするのが難しいトリガーがありました. 球体、オブジェクト、パスファインディング、それぞれの完全に異なるマシンに焦点を当てた全体を見ると、これまでにないほど前例のないものでした。それは、レーダーの下で事実をすり抜けていた別のことが繰り返しあったという影響を与えました。 膨大な (50MB) メッセージ トレースとワールド オブジェクト ダンプをふるいにかけることで、このスキームは前例のないほど巧妙なものになりました。 スキームの一部はかつては概念的でした – プログラマーは、シミュレーションのあるレベルでランダムへの呼び出しの同一の決定を老化させるコードを書かなければならないことに慣れていませんでした (はい、乱数はシードされ、スマートに同期されていました) )。クラス実現 エイジ オブ エンパイア のネットワーキングのパターンで、多くの重要なクラスが実現されました。これは、ゲームのマルチプレイヤー マシンのパターンに関連する可能性があります。 あなたの特定の人物を知る. 特定の人物を研究することは、マルチプレイヤーの効率に対する彼らの期待を理解するために必須です。 、モジーと認識され、遅延が露呈します。 ゲームのトレンドはそれぞれまったく異なるため、露骨なゲームプレイとコントロールに何が適しているかを知っておく必要があります。 パターン コースの早い段階で、Heed はリード ドレスメーカーと話し合い、通信遅延のプロトタイプを作成しました (これは、パターン コースのあるレベルで再検討されたものでした)。 単一参加者のレクリエーションがかつて機能していたという説明については、まったく異なる範囲の露出レイテンシをシミュレートし、適切、緩い、ぎくしゃくした、または実際に見苦しいと感じたときに参加者のフィードバックを救うことはかつては簡単でした. RTS ゲームでは、250 ミリ秒のエクスポーズ レイテンシーはかつては気付かれませんでした。 熱心なゲーマーが、クリックしてからユニットが応答するまでの間に、「レクリエーションテンポ」と、モージーに対する心理的な期待を発達させたことを隠すことも、かつては魅力的でした。 固定の遅い応答は、迅速と遅延の露出遅延 (80 ~ 500 ミリ秒に関連) を交互に繰り返すよりも優れていました。ささやくのが難しい。 有効な言葉で言えば、これはプログラミングの努力の多くをスムーズに向けました。 — 以前は、より長いフリップ サイズを購入して、ロット全体が柔らかく固定されていることを確認する方が、時折ビハインド ダウンで可能な限り速くスピードを出すよりも優れていました。 速度の変更は、可能な限り遅れて、可能な限り正確に増分する必要がありました。 さらに、マシンに対するユーザーの要求を測定しました。ユーザーはコマンド (移動、攻撃、木を切る) を平均して約 1.5 秒から 2 秒ごとに明確にすることがありました。 . 私たちのレクリエーションが必死の活動のクレッシェンドに構築されて以来、最も重い通信要求は中心的でのんびりとしたレクリエーションでした. 自分の特定の行動を意識する時間を購入しても、ネットワークプレイに役立つゲームのプレイ方法に関するさまざまな問題を見ることができます. AoE では、通常、ユーザーが興奮して攻撃しているときにクリックすると (clik-lik-lik-lik-lik — travel travel travel )、1 秒あたりに発行されるコマンドの決定に大きなスパイクが発生していました。 — そして、彼らがユニットの驚くべき近隣を通過していた場合 — ネットワークの巨大なスパイクは、スマートに尋ねます。 同一セットに対する繰り返しコマンドを破棄する簡単なフィルターにより、この動作の影響が大幅に軽減されました。 要約すると、特定の人物を観察する夢は、次の方法を示します。- あなたのレクリエーションでの特定の人の待ち時間の期待を知ってください プレイの初期段階でのマルチプレイヤーの側面のプロトタイプ マルチプレイヤーの効率を損なう動作を一目で確認します。 メータリングは王様です. 通信マシンがどのように機能しているかについての微妙な問題を同時に調べます。早い段階でメータリングを確立し、テスターが読み取れるように作成し、ささやいてネットワーク エンジンの内部で何が起こっているかを把握します。 教訓: AoE ダイアログに関する多くの問題は、Heed がメータリングをあまりにも早く削除し、最後のコードが一度入力された後にメッセージ (サイズと頻度) レベルを再確認できなかったため、解決されませんでした。 AI の速度条件、巧妙な計算パス、不適切に構造化されたエクスポーズ パケットは、そうでなければスマートに調整されたマシンで大きな効率の問題を引き起こす可能性があります。 マシンが境界条件を超えているように見える場合は、テスターと開発者にマシンのリスプを依頼してください。プログラマーとテスターは、義務がマシンにストレスを与えているパターンの期間を楽しみにしています。それについて。 通信マシンがどのように機能するかについてテスターを教育し、抽象的なメーターを示して平準化する時間を伝えます。また、ネットワーク コードが必然的に新しい障害に遭遇したときに、テスターがどのような問題を監視しているかに非常に賢明にショックを受ける可能性があります。 要約すると、あなたのメータリングはおそらく静かでもあります:
- 人間が読みやすく、テスターが理解できるようにする ボトルネック、スローダウン、および問題を隠す 影響が少なく、作業中ずっと節約できます。 開発者への指示
エクスポーズの発行、取得、および処理の間の分離は注意が必要です。 おそらく発生しない可能性があること、または最初に公開を明確にしてから数秒後に発生する可能性があることを要求していることを無視するのは簡単です。 コマンドは、送信時と受信時にそれぞれ有効性がチェックされる可能性があります。 同期モデルでは、プログラマーはさらに、一度シミュレーションを行ったときにコードがネイティブ要因 (空き時間、特別なハードウェア、まったく異なる設定など) に依存してはならないことを考慮して構築する必要がありました。 すべてのマシンのコード パスが一致する必要があります。 シミュレーションのあるレベルでランダムな地形の音を持つイラストは、ゲームが異なる方法で動作するようにトリガーします (シミュレーションのいくつかのレベルで問題を処理するために、最後のランダムな量で擬似乱数ジェネレーターを保存して再シードします)。ランダムにしたかったのですが、シミュレーションを販売しませんでした. 一種のクラスです. これは好みの感覚のはずですが、三度目のネットワーク (私たちの場合は DirectPlay) で、「保証された配送」と言った後、メッセージがそこで回収されること、実際には「保証されたパケットが公開される」ことを確認するアプリケーションを作成します。製品には隠れたボトルネックや、ゲームの通信を処理する新しい動作がないこと。 シミュレーション関数を作成する準備をして、シミュレーターを見てみましょう。 最終的に、接続フラッディング、同時マッチメイキング接続の問題、保証されたパケットのドロップなどの問題を分離して強調するために、3 つの完全に異なる最小限の機能を検討しました。 システムで可能な限り早い段階で、モデム (および、運が良ければモデム シミュレーター) を調べてみてください。 パターンコースのいくつかのレベルで、モデムのテストを引き続き (それは苦痛ですが) 含みます。 問題を特定するのは難しいため (ISP、ゲーム、通信ツール、モデム、マッチメイキング プロバイダー、または完全に別の停止のセージで突然パフォーマンスが低下するのでしょうか?) 実際のユーザーは不安定な問題で苦労するに値しません。高速接続の LAN 速度で高速に接続された後のダイヤルアップ接続。 LAN マルチプレイヤー ゲームと同じように、モデム接続でテストが完了していることを保証することが必須です。 エイジ オブ エンパイア 2 の改善点 Age of Empires 2: The Age of Kings では、記録されたゲーム、ファイル転送、Zone での継続的な統計追跡など、最新のマルチプレイヤー ファセットを追加しました。 さらに、Age of Empires のロックを解除するために発生したバグや効率の問題に対処するために、DirectPlay の統合や速度調整などのマルチプレイヤー システムを微調整します。 スポーツ記録の特徴は、かつては「デバッグのために実際にこれをささやくかもしれない」仕事としてたまたま偶然出くわした問題の一種であり、最終的にはふっくらとしたレクリエーションの特徴になりました. 記録されたゲームは、熱心なゲーマーが概念を交互に分析したり、悪名高い戦いを意識したり、実行したゲームを概観したりできるため、ファンのインターネット サイトで非常にスマートに好まれています。デバッグ ツールとして、記録されたゲームは価値があります。 私たちのシミュレーションは決定論的であり、記録されたゲームはマルチプレイヤーが同期しているのと同じシステムで同期されているため、レクリエーションの記録により、バグの再現条件を渡す巨大なシステムが得られました。 . The Zone のマッチメイキング マシンとの統合は、かつては Age of Empires のレクリエーションを簡単に開始することはほとんどありませんでした。 Age of Kings では、これを延長して、オープン パラメータの調整と継続的な統計レポートを有効にしました。 完全なインサイドアウト マシンではありませんが、DirectPlay のホワイエ オープン機能を利用して、ゾーンがプレレクリエーション テーブルからゲーム設定の特定の側面を操作できるようにし、ゲームが実際に起動されると、それらの設定を「ロック」します。 これにより、ユーザーは、プレイしたいゲームをより多く回収することができました。おそらく、マッチメイキング ステージの設定を見て、ゲーム セットアップの非表示を開くのを待ちたいと思うでしょう。 バックエンドでは、継続的な統計レポートと追跡を実装しました。 お気に入りの建物を The Zone に提供し、それを楽しみ、レクリエーションのヒントに追加します。 この建物の記録データは、特定の人物のランキングとゾーンの Web 住居で表示可能なランキングを決定するために古くなっています。 RTS3 マルチプレイヤー: 夢 RTS3 は、Ensemble の次世代デザイン レクリエーションのコードネームです。 RTS3 は、エイジ オブ エンパイア シリーズのゲームで熟成された成功システムに基づいて構築されており、現代的な側面とマルチプレイヤーの必需品の決定を求めています。 エイジ オブ エンパイア 1 および 2 の特徴的な空間に基づいて構築されています。 ウェブプレイ、膨大な種類のマップ、数千の制御可能なユニットなど、必需品を消す必要があります。 3D — RTS3 は完全な 3D レクリエーションであり、補間されたアニメーションとファセット化されていない単位空間と回転を備えています。 非常に熱心なゲーマー – 8 人以上の熱心なゲーマー向けの実行可能な強化。 TCP/IP の強化 — 56okay TCP/IP Web 接続は、私たちの基本的な目標です。 ホーム ネットワークの強化 — ファイアウォールと NAT セットアップに加えて、特定の個人の住居ネットワーク構成を強化します。 RTS3 では、Age of Empires 1 および 2 と同じ基盤となるネットワーク モデル (同期シミュレーション) とともに移動することを早い段階で決定しました。 RTS3 の賢さは、このアーキテクチャの長所を同一のコンセプトで実現するために行われました。 AOE/AOK では、トランスポートおよびセッション管理サービスと製品を DirectPlay に依存していましたが、RTS3 ではコア ネットワーク ライブラリを作成することにしました。そこから私たちの基盤と構築。 完全な 3D ワールドへの旅は、マルチプレイヤーでのフレーム レートと全体的なシミュレーションの滑らかさの問題に特に敏感になりたいということを意味しました。 ただし、これは、シミュレーションの更新時間とフレームレートが前例のないほど変動しやすくなり、レンダリングに余分な時間を費やす可能性があることも意味していました. Genie エンジンでは、ユニットのローテーションがファセット化され、アニメーションがフレームレートでロックされていました (BANG! を使用)。 任意のユニットのローテーションと柔らかいアニメーションを可能にしました。これは、ゲームが視覚的に前例のないものになることを意味し、遅延とルックソーイングの更新料金の結果に非常に敏感になりました。 Age of Kings のパターンから抜け出し、デバッグ時間に関しては、余分なアップエントランス メイクとエネルギー空間の作業が良い見返りをもたらすような深刻な領域に対処したいと考えました。 また、反復的なプレイ テスト コースがかつてゲームの作成にどれほど基本的であったかを認識したため、マルチプレイヤー ゲームを実行可能な限り早くオンラインにすることが優先されました。 RTS3通信構造 オブジェクト指向システム. RTS3 のネットワーク アーキテクチャは強力なオブジェクト指向です (Determin 6 を見てください)。 お気に入りのオブジェクトとシステムのスペースの助けを借りて、プラットフォーム、プロトコル、およびトポロジの詳細を抽象化することで、OO の強みを実際に実行するために、複数のネットワーク構成をサポートする必要があります。 ネットワーク オブジェクトのプロトコル 明示バージョンとトポロジ 明示バージョンは、可能な限り正確なコードを所有しています。 これらのオブジェクトの機能の大部分は、より大きなステージのマザーまたはファーザー オブジェクトに分離されています。 ブランドの現代的なプロトコルを強制するために、プロトコルの明示的なコードを所有するに値する最も便利なネットワーク オブジェクト (プロトコルに従って完全に異なるいくつかの問題を実行するに値するクライアントやセッションなど) を長くします。 マシン内の完全に異なるオブジェクト (Channels、TimeSync など) はどれも、高度な抽象インターフェイスを介して最も便利なクライアントおよびセッションとインターフェイスするため、セージ上の商取引を必要としません。 さらに、単一の支援で多次元導出を強制するための集約の使用についてささやきます(導出の順序付けられた/順序付けられていない軸を所有するチャネルなど)。 ジェネリック インターフェイス。 仮想概念は、コールバック関数のささやきを求めて、非集中的な通知のためにさらに熟成されます。 Glimpse トポロジー。 Genie エンジンは、時計から時計へのネットワーク トポロジーをサポートしていました。セッションは膨大なタイトル構成で、まったく異なる購入者全員とつながります。 RTS3 を使用して、同期シミュレーション モデルに適用した場合の固有の利点について、このトポロジの賢者についてささやき続けてきました。 監視トポロジーは、セッション内の接続された購入者の巨大なタイトル構成を意味します (決定 7)。 つまり、すべての購入者は、まったく異なるすべての購入者とつながります。 これは Age 1 と 2 が使用した設定です。 ちらりと見る強み: マシンの明確なクライアント – クライアントの性質に起因する待ち時間の短縮。メッセージのクライアント – サーバー – クライアントのラウンドトリップよりもわずかです。 中央レベルの障害はありません。クライアント (ホストも) がセッションから切断されても、ゲームは続行できます。 ちらりと見る弱点: マシン内の非常に魅力的な接続 (Summation n=0 to ok-1 (n)) — 実行可能な障害の側面と実行可能な遅延を引き出します。 このシステムで一部の NAT 構成を強化する可能性はほとんどありません。 Win.lib. RTS3 通信アーキテクチャを設計する際の目標は、かつてはかつてデザインゲーム用に調整されていましたが、同時に、自宅の楽器用に非常にスマートに熟成され、将来のゲームを強化するために延長される可能性のあるものを作りたいと考えていました. この目標を達成するために、クライアントやセッションなどのレクリエーション ステージ オブジェクトを支援するレイヤード アーキテクチャを作成しましたが、さらに、リンクやネットワークなどのステージ トランスポート オブジェクトを削減するのに役立ちます 。 RTS3 は、次世代の BANG! に基づいて構築されています。 エンジンは、サウンド、レンダリング、ネットワークなどのコンポーネント ライブラリを備えたモジュラー アーキテクチャを使用します。 ネットワーク サブシステムは、BANG! とリンクするコンポーネントとしてここに適しています。 エンジン(完全に異なる居住用楽器と同じくらい賢く)。 私たちのネットワーク モデルは 4 つのプロバイダー レイヤーに分割されており、OSI ネットワーク モデルとは異なり、セージをゲームに適用するのと同時に、完全ではありませんが、ほとんど取り込んでいます (Determin 8 を参照)。 靴下、レベル1 最初のステージである Socks は、最前線のソケット ステージ C API を提供し、異なる動作システム上で低ステージ ネットワーク ルーチンのお気に入りのスペースを生成するために抽象化されます。 インターフェイスは Berkley ソケットに似ています。 Socks ステージは、基本的にネットワーク ライブラリのより大きなレベルによってエージングされますが、実際には、コードを適用することによってエージングされることは決してありません。 リンク、レベル 2 レベル 2 (リンク レベル) は、トランスポート層のサービスと製品を提供します。 Link、Listener、NetworkAddress、Packet などのこの段階のオブジェクトは、接続を設定し、そのあるレベルでいくつかのメッセージを送信する必要がある重要な部分をアサートします (決定 9 を参照)。 Packet: これが私たちの最も重要なメッセージ構築です — get シリアライゼーション/デシリアライゼーションを (純粋なデジタル概念を通じて) ロボットによって管理する拡張可能なオブジェクトです。リンクオブジェクトのあるレベルでディスパッチされたとき。 リンク: 2 つのネットワーク エンドポイント間の接続。 これは、ループバック リンクである可能性もあります。この場合、エンドポイントはそれぞれ同一のマシン上にあります。 リンク上のシップ アンド ゲインの概念は、Packets とさらに voidrecordsdata バッファーを使用して特性を引き寄せることを知っています。 リスナー: リンクジェネレーター。 このオブジェクトは着信接続をリッスンし、接続が確立されるとリンクを生成します。 ファイル循環: これは、特定のリンクのあるレベルでの任意の計測可能な記録データ循環です — 例として、ファイル転送を強制するためにエージングされます. Win Address: プロトコルは単なるネットワークアドレス指定オブジェクト - Ping: 簡単な ping クラス。 特定のリンクでのネットワーク遅延レベルのエクスペリエンス。
- マルチプレイヤー、レベル 3 マルチプレイヤー ステージは、gain.lib API で利用可能なオブジェクトとルーチンの最も可能性の高いステージです。 これは、RTS3 がリンクなどのステージ オブジェクトを収集して、購入者やコースなどの非常に価値のある概念/オブジェクトに統合するときにインターフェイスとなるレイヤーです。 基本的にBANGで最も魅力的なオブジェクト! ネットワーク ライブラリは、おそらくマルチプレイヤー ステージに存在する可能性があるものです。 ここで、API はゲーム ステージが対話するオブジェクトの空間を項目化しますが、実装ではレクリエーションのみのシステムを処理します。
クライアント: 基本的に、これはネットワーク エンドポイントの最も好ましい抽象化です。 これは、遠く離れたクライアント (リンク) またはネイティブ クライアント (ループバック リンク) として構成されている可能性があります。 購入者はすぐに作成する必要はありませんが、セッション オブジェクトによって別の方法で生成されます。 セッション: 購入者の紹介、接続交渉、シリーズ、管理を担当するオブジェクトです。 セッションには、完全に異なるマルチプレイヤー ステージ オブジェクト全体が含まれます。 このオブジェクトをささやくために、アプリケーションは単にホスト()または結合()を呼び出すだけで、ネイティブの世話をするか、遠く離れた世話をするかのいずれかを与え、セッションは快適さを処理します。 これらの義務には、ロボットによる購入者の作成/削除、セッション機会の通知、および許容可能なオブジェクトへのトラフィックのディスパッチが含まれます。 Channel および Ordered Channel: このオブジェクトは、デジタル メッセージ コンジットを表します。 チャネルのあるレベルで送信されたメッセージは、ロボットによって分離され、遠く離れた購入者の対応するチャネル オブジェクトに到達する可能性があります。 順序付けられたチャネルは TimeSync オブジェクトと連携して、そのチャネルで取得されたメッセージの順序がすべての購入者で同じになる可能性があることを保証します。 共有ファイル: すべての購入者のあるレベルで共有される一連の知識を表します。 このオブジェクトを長くして、get recordsdata の種類を所有する明示的なケースを作成し、組み込みのソリューションをささやいて、ネットワークのあるレベルでこれらの recordsdata 部分のコンピューター化された同期更新を有効にします。 Time Sync: セッション内のすべての購入者のあるレベルで、同期されたネットワーク時間の入札進行を管理します。 ゲームコミュニケーション、レベル4 通信ステージは、RTS3 の問題の側面です。 これは、ゲームがネットワーク ライブラリとインターフェイスする一連の重要なシステムであり、実際には、ゲーム コード自体のあるレベルに存在します。 通信レイヤーは、マルチプレイヤー ステージ ネットワーク オブジェクトの導入と管理のための多数の有用なユーティリティ機能を提供し、ゲームのマルチプレイヤーが必要とするものを、ささやきやすい非常に簡単なインターフェイスに要約する努力をします。 最新の機能と優れたツール 改善された同期マシン。 エイジ オブ エンパイア パターンには誰もいないチームは、実行可能な優れた同期機器の必要性を主張します。 他の冒険と同様に、あるレベルの事後分析のパターンコースで賢者の助けを借りると同時に、いくつかの分野は、最も多くの時間を費やした分野として繰り返し際立っていますが、前例のないほど多くの時間を費やした可能性があります。与えられた追加の上り口の作業に費やす時間が大幅に短縮されます。 RTS3 でパターンを開始したため、同期のデバッグはおそらくこのレコードの停止時に行われました。 RTS3 同期追跡マシンは、基本的に、同期バグの迅速なフリップアラウンドに対応しています。 それを増やす上での私たちのまったく異なる優先事項は、開発者にとってささやきやすさ、マシン全体に注ぐ大量の同期レコードデータに対処するスキル、ロック解除生成物で同期コードを完全に組み立てるスキル、そして遅かれ早かれいくつかの変数を切り替えて再コンパイルを要求することで、構成を完全に商売するスキル。 RTS3 での同期チェックは、次の 2 つのマクロ セットによって終了します: #syncRandCode(userinfo) の明確化 gSync->addCodeSync(cRandSync, userinfo, __FILE__, __LINE__) #clarify syncRandData(userinfo, v) gSync->addDataSync(cRandSync, v, userinfo, __FILE__, __LINE__) (同期「スタンプ」ごとにこれらのマクロのスペースがあり、スタンプは同期される特定のマシンを表します。この状況では、乱数ジェネレーター cRandSync) これらのマクロはそれぞれ、タイトルである userinfo 文字列パラメーターを購入します。または、カテゴリ商品が同期されていることを示します。 例として、sync 呼び出しはおそらく次のように sage に取り込まれます: syncRandCode(“ランダム シードの同期”, シード); 同期コンソール コマンドと構成変数。 コンソール コマンドと構成変数は、パターン コースに非常に多く含まれています。の Quake mod 作成者が証明するように。 コンソール コマンドは、スタートアップ コンフィギュレーション ファイル、ゲームのあるレベルのコンソール、または任意のレクリエーション機能を呼び出す UI フックを介して実行される簡単な特徴的な呼び出しです。 構成変数は、recordsdata の種類と名付けられ、あらゆる種類のテストおよび構成パラメーターに対してささやく、簡単なサルベージ、スペース、明確化、およびトグル機能を通じて公開されます。 Paul は、コンソール公開および構成変数システムのマルチプレイヤー対応バージョンを派生させました。 これらを使用すると、構成変数の定義にフラグを追加することで、スキームなしでお気に入りの構成変数 (enableCheat など) をマルチプレイヤー構成変数に正しく戻すことができます。 このフラグを有効にすると、その構成変数がマルチプレイヤー ゲームで渡され、同期ゲームの決定 (フリー ハンディ リソースのトリビュートを有効にするかどうかなど) も、基本的にレートに基づいて非常にスマートに行われる可能性があります。 マルチプレイヤー コンソール コマンドも同じ信念です。マルチプレイヤー対応のコンソール エクスポーズへの呼び出しは、すべてのクライアント マシンで渡され、同期的に実行されます。 これら 2 つの手段を適用することで、開発者は、コードの痕跡を一切書かずにマルチプレイヤー マシンをささやく簡単なシステムを手に入れることができます。 最新のテスト機器や構成を迅速に追加でき、計画を立て直すことなくネットワーク環境でそれらを有効にできます。 総和賢者モデルに取り込まれる同期シミュレーションは、かつてエイジ オブ エンパイア シリーズのゲームで効率的に熟成されました。 このシステムの重要な課題 (同期やネットワーク メータリングなど) に対処するための手段やテクノロジの作成に時間を費やすことの重要性を認識するのは難しいことですが、このアーキテクチャの実行可能性は、有効時間設計の傾向に適用したときに証明されます。 RTS3 エンドに実装された次の改善により、基本的に最も見苦しいネットワーク条件にもかかわらず、1 人の参加者とほとんど見分けがつかない完全なマルチプレイヤー エクスペリエンスが実現します。
クラス実現 エイジ オブ エンパイア のネットワーキングのパターンで、多くの重要なクラスが実現されました。これは、ゲームのマルチプレイヤー マシンのパターンに関連する可能性があります。 あなたの特定の人物を知る.
- 特定の人物を研究することは、マルチプレイヤーの効率に対する彼らの期待を理解するために必須です。 、モジーと認識され、遅延が露呈します。 ゲームのトレンドはそれぞれまったく異なるため、露骨なゲームプレイとコントロールに何が適しているかを知っておく必要があります。 パターン コースの早い段階で、Heed はリード ドレスメーカーと話し合い、通信遅延のプロトタイプを作成しました (これは、パターン コースのあるレベルで再検討されたものでした)。 単一参加者のレクリエーションがかつて機能していたという説明については、まったく異なる範囲の露出レイテンシをシミュレートし、適切、緩い、ぎくしゃくした、または実際に見苦しいと感じたときに参加者のフィードバックを救うことはかつては簡単でした. RTS ゲームでは、250 ミリ秒のエクスポーズ レイテンシーはかつては気付かれませんでした。 熱心なゲーマーが、クリックしてからユニットが応答するまでの間に、「レクリエーションテンポ」と、モージーに対する心理的な期待を発達させたことを隠すことも、かつては魅力的でした。 固定の遅い応答は、迅速と遅延の露出遅延 (80 ~ 500 ミリ秒に関連) を交互に繰り返すよりも優れていました。ささやくのが難しい。 有効な言葉で言えば、これはプログラミングの努力の多くをスムーズに向けました。 — 以前は、より長いフリップ サイズを購入して、ロット全体が柔らかく固定されていることを確認する方が、時折ビハインド ダウンで可能な限り速くスピードを出すよりも優れていました。 速度の変更は、可能な限り遅れて、可能な限り正確に増分する必要がありました。 さらに、マシンに対するユーザーの要求を測定しました。ユーザーはコマンド (移動、攻撃、木を切る) を平均して約 1.5 秒から 2 秒ごとに明確にすることがありました。 . 私たちのレクリエーションが必死の活動のクレッシェンドに構築されて以来、最も重い通信要求は中心的でのんびりとしたレクリエーションでした. 自分の特定の行動を意識する時間を購入しても、ネットワークプレイに役立つゲームのプレイ方法に関するさまざまな問題を見ることができます. AoE では、通常、ユーザーが興奮して攻撃しているときにクリックすると (clik-lik-lik-lik-lik — travel travel travel )、1 秒あたりに発行されるコマンドの決定に大きなスパイクが発生していました。 — そして、彼らがユニットの驚くべき近隣を通過していた場合 — ネットワークの巨大なスパイクは、スマートに尋ねます。 同一セットに対する繰り返しコマンドを破棄する簡単なフィルターにより、この動作の影響が大幅に軽減されました。 要約すると、特定の人物を観察する夢は、次の方法を示します。
- あなたのレクリエーションでの特定の人の待ち時間の期待を知ってください プレイの初期段階でのマルチプレイヤーの側面のプロトタイプ マルチプレイヤーの効率を損なう動作を一目で確認します。 メータリングは王様です. 通信マシンがどのように機能しているかについての微妙な問題を同時に調べます。早い段階でメータリングを確立し、テスターが読み取れるように作成し、ささやいてネットワーク エンジンの内部で何が起こっているかを把握します。 教訓: AoE ダイアログに関する多くの問題は、Heed がメータリングをあまりにも早く削除し、最後のコードが一度入力された後にメッセージ (サイズと頻度) レベルを再確認できなかったため、解決されませんでした。 AI の速度条件、巧妙な計算パス、不適切に構造化されたエクスポーズ パケットは、そうでなければスマートに調整されたマシンで大きな効率の問題を引き起こす可能性があります。 マシンが境界条件を超えているように見える場合は、テスターと開発者にマシンのリスプを依頼してください。プログラマーとテスターは、義務がマシンにストレスを与えているパターンの期間を楽しみにしています。それについて。 通信マシンがどのように機能するかについてテスターを教育し、抽象的なメーターを示して平準化する時間を伝えます。また、ネットワーク コードが必然的に新しい障害に遭遇したときに、テスターがどのような問題を監視しているかに非常に賢明にショックを受ける可能性があります。 要約すると、あなたのメータリングはおそらく静かでもあります:
- 人間が読みやすく、テスターが理解できるようにする ボトルネック、スローダウン、および問題を隠す 影響が少なく、作業中ずっと節約できます。 開発者への指示
- エクスポーズの発行、取得、および処理の間の分離は注意が必要です。 おそらく発生しない可能性があること、または最初に公開を明確にしてから数秒後に発生する可能性があることを要求していることを無視するのは簡単です。 コマンドは、送信時と受信時にそれぞれ有効性がチェックされる可能性があります。 同期モデルでは、プログラマーはさらに、一度シミュレーションを行ったときにコードがネイティブ要因 (空き時間、特別なハードウェア、まったく異なる設定など) に依存してはならないことを考慮して構築する必要がありました。 すべてのマシンのコード パスが一致する必要があります。 シミュレーションのあるレベルでランダムな地形の音を持つイラストは、ゲームが異なる方法で動作するようにトリガーします (シミュレーションのいくつかのレベルで問題を処理するために、最後のランダムな量で擬似乱数ジェネレーターを保存して再シードします)。ランダムにしたかったのですが、シミュレーションを販売しませんでした. 一種のクラスです. これは好みの感覚のはずですが、三度目のネットワーク (私たちの場合は DirectPlay) で、「保証された配送」と言った後、メッセージがそこで回収されること、実際には「保証されたパケットが公開される」ことを確認するアプリケーションを作成します。製品には隠れたボトルネックや、ゲームの通信を処理する新しい動作がないこと。 シミュレーション関数を作成する準備をして、シミュレーターを見てみましょう。 最終的に、接続フラッディング、同時マッチメイキング接続の問題、保証されたパケットのドロップなどの問題を分離して強調するために、3 つの完全に異なる最小限の機能を検討しました。 システムで可能な限り早い段階で、モデム (および、運が良ければモデム シミュレーター) を調べてみてください。 パターンコースのいくつかのレベルで、モデムのテストを引き続き (それは苦痛ですが) 含みます。 問題を特定するのは難しいため (ISP、ゲーム、通信ツール、モデム、マッチメイキング プロバイダー、または完全に別の停止のセージで突然パフォーマンスが低下するのでしょうか?) 実際のユーザーは不安定な問題で苦労するに値しません。高速接続の LAN 速度で高速に接続された後のダイヤルアップ接続。 LAN マルチプレイヤー ゲームと同じように、モデム接続でテストが完了していることを保証することが必須です。 エイジ オブ エンパイア 2 の改善点 Age of Empires 2: The Age of Kings では、記録されたゲーム、ファイル転送、Zone での継続的な統計追跡など、最新のマルチプレイヤー ファセットを追加しました。 さらに、Age of Empires のロックを解除するために発生したバグや効率の問題に対処するために、DirectPlay の統合や速度調整などのマルチプレイヤー システムを微調整します。 スポーツ記録の特徴は、かつては「デバッグのために実際にこれをささやくかもしれない」仕事としてたまたま偶然出くわした問題の一種であり、最終的にはふっくらとしたレクリエーションの特徴になりました. 記録されたゲームは、熱心なゲーマーが概念を交互に分析したり、悪名高い戦いを意識したり、実行したゲームを概観したりできるため、ファンのインターネット サイトで非常にスマートに好まれています。デバッグ ツールとして、記録されたゲームは価値があります。 私たちのシミュレーションは決定論的であり、記録されたゲームはマルチプレイヤーが同期しているのと同じシステムで同期されているため、レクリエーションの記録により、バグの再現条件を渡す巨大なシステムが得られました。 . The Zone のマッチメイキング マシンとの統合は、かつては Age of Empires のレクリエーションを簡単に開始することはほとんどありませんでした。 Age of Kings では、これを延長して、オープン パラメータの調整と継続的な統計レポートを有効にしました。 完全なインサイドアウト マシンではありませんが、DirectPlay のホワイエ オープン機能を利用して、ゾーンがプレレクリエーション テーブルからゲーム設定の特定の側面を操作できるようにし、ゲームが実際に起動されると、それらの設定を「ロック」します。 これにより、ユーザーは、プレイしたいゲームをより多く回収することができました。おそらく、マッチメイキング ステージの設定を見て、ゲーム セットアップの非表示を開くのを待ちたいと思うでしょう。 バックエンドでは、継続的な統計レポートと追跡を実装しました。 お気に入りの建物を The Zone に提供し、それを楽しみ、レクリエーションのヒントに追加します。 この建物の記録データは、特定の人物のランキングとゾーンの Web 住居で表示可能なランキングを決定するために古くなっています。
- Ping: 簡単な ping クラス。 特定のリンクでのネットワーク遅延レベルのエクスペリエンス。 マルチプレイヤー、レベル 3 マルチプレイヤー ステージは、gain.lib API で利用可能なオブジェクトとルーチンの最も可能性の高いステージです。 これは、RTS3 がリンクなどのステージ オブジェクトを収集して、購入者やコースなどの非常に価値のある概念/オブジェクトに統合するときにインターフェイスとなるレイヤーです。 基本的にBANGで最も魅力的なオブジェクト! ネットワーク ライブラリは、おそらくマルチプレイヤー ステージに存在する可能性があるものです。 ここで、API はゲーム ステージが対話するオブジェクトの空間を項目化しますが、実装ではレクリエーションのみのシステムを処理します。
- クライアント: 基本的に、これはネットワーク エンドポイントの最も好ましい抽象化です。 これは、遠く離れたクライアント (リンク) またはネイティブ クライアント (ループバック リンク) として構成されている可能性があります。 購入者はすぐに作成する必要はありませんが、セッション オブジェクトによって別の方法で生成されます。 セッション:
- 購入者の紹介、接続交渉、シリーズ、管理を担当するオブジェクトです。 セッションには、完全に異なるマルチプレイヤー ステージ オブジェクト全体が含まれます。 このオブジェクトをささやくために、アプリケーションは単にホスト()または結合()を呼び出すだけで、ネイティブの世話をするか、遠く離れた世話をするかのいずれかを与え、セッションは快適さを処理します。 これらの義務には、ロボットによる購入者の作成/削除、セッション機会の通知、および許容可能なオブジェクトへのトラフィックのディスパッチが含まれます。 Channel および Ordered Channel:
- このオブジェクトは、デジタル メッセージ コンジットを表します。 チャネルのあるレベルで送信されたメッセージは、ロボットによって分離され、遠く離れた購入者の対応するチャネル オブジェクトに到達する可能性があります。 順序付けられたチャネルは TimeSync オブジェクトと連携して、そのチャネルで取得されたメッセージの順序がすべての購入者で同じになる可能性があることを保証します。 共有ファイル:
- すべての購入者のあるレベルで共有される一連の知識を表します。 このオブジェクトを長くして、get recordsdata の種類を所有する明示的なケースを作成し、組み込みのソリューションをささやいて、ネットワークのあるレベルでこれらの recordsdata 部分のコンピューター化された同期更新を有効にします。 Time Sync:
- セッション内のすべての購入者のあるレベルで、同期されたネットワーク時間の入札進行を管理します。
ゲームコミュニケーション、レベル4 通信ステージは、RTS3 の問題の側面です。 これは、ゲームがネットワーク ライブラリとインターフェイスする一連の重要なシステムであり、実際には、ゲーム コード自体のあるレベルに存在します。 通信レイヤーは、マルチプレイヤー ステージ ネットワーク オブジェクトの導入と管理のための多数の有用なユーティリティ機能を提供し、ゲームのマルチプレイヤーが必要とするものを、ささやきやすい非常に簡単なインターフェイスに要約する努力をします。- 最新の機能と優れたツール 改善された同期マシン。 エイジ オブ エンパイア パターンには誰もいないチームは、実行可能な優れた同期機器の必要性を主張します。 他の冒険と同様に、あるレベルの事後分析のパターンコースで賢者の助けを借りると同時に、いくつかの分野は、最も多くの時間を費やした分野として繰り返し際立っていますが、前例のないほど多くの時間を費やした可能性があります。与えられた追加の上り口の作業に費やす時間が大幅に短縮されます。 RTS3 でパターンを開始したため、同期のデバッグはおそらくこのレコードの停止時に行われました。 RTS3 同期追跡マシンは、基本的に、同期バグの迅速なフリップアラウンドに対応しています。 それを増やす上での私たちのまったく異なる優先事項は、開発者にとってささやきやすさ、マシン全体に注ぐ大量の同期レコードデータに対処するスキル、ロック解除生成物で同期コードを完全に組み立てるスキル、そして遅かれ早かれいくつかの変数を切り替えて再コンパイルを要求することで、構成を完全に商売するスキル。 RTS3 での同期チェックは、次の 2 つのマクロ セットによって終了します: #syncRandCode(userinfo) の明確化 gSync->addCodeSync(cRandSync, userinfo, __FILE__, __LINE__) #clarify syncRandData(userinfo, v) gSync->addDataSync(cRandSync, v, userinfo, __FILE__, __LINE__) (同期「スタンプ」ごとにこれらのマクロのスペースがあり、スタンプは同期される特定のマシンを表します。この状況では、乱数ジェネレーター cRandSync) これらのマクロはそれぞれ、タイトルである userinfo 文字列パラメーターを購入します。または、カテゴリ商品が同期されていることを示します。 例として、sync 呼び出しはおそらく次のように sage に取り込まれます: syncRandCode(“ランダム シードの同期”, シード); 同期コンソール コマンドと構成変数。 コンソール コマンドと構成変数は、パターン コースに非常に多く含まれています。の Quake mod 作成者が証明するように。 コンソール コマンドは、スタートアップ コンフィギュレーション ファイル、ゲームのあるレベルのコンソール、または任意のレクリエーション機能を呼び出す UI フックを介して実行される簡単な特徴的な呼び出しです。 構成変数は、recordsdata の種類と名付けられ、あらゆる種類のテストおよび構成パラメーターに対してささやく、簡単なサルベージ、スペース、明確化、およびトグル機能を通じて公開されます。 Paul は、コンソール公開および構成変数システムのマルチプレイヤー対応バージョンを派生させました。 これらを使用すると、構成変数の定義にフラグを追加することで、スキームなしでお気に入りの構成変数 (enableCheat など) をマルチプレイヤー構成変数に正しく戻すことができます。 このフラグを有効にすると、その構成変数がマルチプレイヤー ゲームで渡され、同期ゲームの決定 (フリー ハンディ リソースのトリビュートを有効にするかどうかなど) も、基本的にレートに基づいて非常にスマートに行われる可能性があります。 マルチプレイヤー コンソール コマンドも同じ信念です。マルチプレイヤー対応のコンソール エクスポーズへの呼び出しは、すべてのクライアント マシンで渡され、同期的に実行されます。 これら 2 つの手段を適用することで、開発者は、コードの痕跡を一切書かずにマルチプレイヤー マシンをささやく簡単なシステムを手に入れることができます。 最新のテスト機器や構成を迅速に追加でき、計画を立て直すことなくネットワーク環境でそれらを有効にできます。 総和賢者モデルに取り込まれる同期シミュレーションは、かつてエイジ オブ エンパイア シリーズのゲームで効率的に熟成されました。 このシステムの重要な課題 (同期やネットワーク メータリングなど) に対処するための手段やテクノロジの作成に時間を費やすことの重要性を認識するのは難しいことですが、このアーキテクチャの実行可能性は、有効時間設計の傾向に適用したときに証明されます。 RTS3 エンドに実装された次の改善により、基本的に最も見苦しいネットワーク条件にもかかわらず、1 人の参加者とほとんど見分けがつかない完全なマルチプレイヤー エクスペリエンスが実現します。
- RTS3 マルチプレイヤー: 夢 RTS3 は、Ensemble の次世代デザイン レクリエーションのコードネームです。 RTS3 は、エイジ オブ エンパイア シリーズのゲームで熟成された成功システムに基づいて構築されており、現代的な側面とマルチプレイヤーの必需品の決定を求めています。
- エイジ オブ エンパイア 1 および 2 の特徴的な空間に基づいて構築されています。 ウェブプレイ、膨大な種類のマップ、数千の制御可能なユニットなど、必需品を消す必要があります。 3D — RTS3 は完全な 3D レクリエーションであり、補間されたアニメーションとファセット化されていない単位空間と回転を備えています。 非常に熱心なゲーマー – 8 人以上の熱心なゲーマー向けの実行可能な強化。 TCP/IP の強化 — 56okay TCP/IP Web 接続は、私たちの基本的な目標です。 ホーム ネットワークの強化 — ファイアウォールと NAT セットアップに加えて、特定の個人の住居ネットワーク構成を強化します。
RTS3 では、Age of Empires 1 および 2 と同じ基盤となるネットワーク モデル (同期シミュレーション) とともに移動することを早い段階で決定しました。 RTS3 の賢さは、このアーキテクチャの長所を同一のコンセプトで実現するために行われました。 AOE/AOK では、トランスポートおよびセッション管理サービスと製品を DirectPlay に依存していましたが、RTS3 ではコア ネットワーク ライブラリを作成することにしました。そこから私たちの基盤と構築。 完全な 3D ワールドへの旅は、マルチプレイヤーでのフレーム レートと全体的なシミュレーションの滑らかさの問題に特に敏感になりたいということを意味しました。 ただし、これは、シミュレーションの更新時間とフレームレートが前例のないほど変動しやすくなり、レンダリングに余分な時間を費やす可能性があることも意味していました. Genie エンジンでは、ユニットのローテーションがファセット化され、アニメーションがフレームレートでロックされていました (BANG! を使用)。 任意のユニットのローテーションと柔らかいアニメーションを可能にしました。これは、ゲームが視覚的に前例のないものになることを意味し、遅延とルックソーイングの更新料金の結果に非常に敏感になりました。 Age of Kings のパターンから抜け出し、デバッグ時間に関しては、余分なアップエントランス メイクとエネルギー空間の作業が良い見返りをもたらすような深刻な領域に対処したいと考えました。 また、反復的なプレイ テスト コースがかつてゲームの作成にどれほど基本的であったかを認識したため、マルチプレイヤー ゲームを実行可能な限り早くオンラインにすることが優先されました。 RTS3通信構造 オブジェクト指向システム. RTS3 のネットワーク アーキテクチャは強力なオブジェクト指向です (Determin 6 を見てください)。 お気に入りのオブジェクトとシステムのスペースの助けを借りて、プラットフォーム、プロトコル、およびトポロジの詳細を抽象化することで、OO の強みを実際に実行するために、複数のネットワーク構成をサポートする必要があります。 ネットワーク オブジェクトのプロトコル 明示バージョンとトポロジ 明示バージョンは、可能な限り正確なコードを所有しています。 これらのオブジェクトの機能の大部分は、より大きなステージのマザーまたはファーザー オブジェクトに分離されています。 ブランドの現代的なプロトコルを強制するために、プロトコルの明示的なコードを所有するに値する最も便利なネットワーク オブジェクト (プロトコルに従って完全に異なるいくつかの問題を実行するに値するクライアントやセッションなど) を長くします。 マシン内の完全に異なるオブジェクト (Channels、TimeSync など) はどれも、高度な抽象インターフェイスを介して最も便利なクライアントおよびセッションとインターフェイスするため、セージ上の商取引を必要としません。 さらに、単一の支援で多次元導出を強制するための集約の使用についてささやきます(導出の順序付けられた/順序付けられていない軸を所有するチャネルなど)。 ジェネリック インターフェイス。 仮想概念は、コールバック関数のささやきを求めて、非集中的な通知のためにさらに熟成されます。 Glimpse トポロジー。 Genie エンジンは、時計から時計へのネットワーク トポロジーをサポートしていました。セッションは膨大なタイトル構成で、まったく異なる購入者全員とつながります。 RTS3 を使用して、同期シミュレーション モデルに適用した場合の固有の利点について、このトポロジの賢者についてささやき続けてきました。 監視トポロジーは、セッション内の接続された購入者の巨大なタイトル構成を意味します (決定 7)。 つまり、すべての購入者は、まったく異なるすべての購入者とつながります。 これは Age 1 と 2 が使用した設定です。 ちらりと見る強み:- マシンの明確なクライアント – クライアントの性質に起因する待ち時間の短縮。メッセージのクライアント – サーバー – クライアントのラウンドトリップよりもわずかです。 中央レベルの障害はありません。クライアント (ホストも) がセッションから切断されても、ゲームは続行できます。 ちらりと見る弱点:
- マシン内の非常に魅力的な接続 (Summation n=0 to ok-1 (n)) — 実行可能な障害の側面と実行可能な遅延を引き出します。 このシステムで一部の NAT 構成を強化する可能性はほとんどありません。
Win.lib.- RTS3 通信アーキテクチャを設計する際の目標は、かつてはかつてデザインゲーム用に調整されていましたが、同時に、自宅の楽器用に非常にスマートに熟成され、将来のゲームを強化するために延長される可能性のあるものを作りたいと考えていました. この目標を達成するために、クライアントやセッションなどのレクリエーション ステージ オブジェクトを支援するレイヤード アーキテクチャを作成しましたが、さらに、リンクやネットワークなどのステージ トランスポート オブジェクトを削減するのに役立ちます 。 RTS3 は、次世代の BANG! に基づいて構築されています。 エンジンは、サウンド、レンダリング、ネットワークなどのコンポーネント ライブラリを備えたモジュラー アーキテクチャを使用します。 ネットワーク サブシステムは、BANG! とリンクするコンポーネントとしてここに適しています。 エンジン(完全に異なる居住用楽器と同じくらい賢く)。 私たちのネットワーク モデルは 4 つのプロバイダー レイヤーに分割されており、OSI ネットワーク モデルとは異なり、セージをゲームに適用するのと同時に、完全ではありませんが、ほとんど取り込んでいます (Determin 8 を参照)。 靴下、レベル1 最初のステージである Socks は、最前線のソケット ステージ C API を提供し、異なる動作システム上で低ステージ ネットワーク ルーチンのお気に入りのスペースを生成するために抽象化されます。 インターフェイスは Berkley ソケットに似ています。 Socks ステージは、基本的にネットワーク ライブラリのより大きなレベルによってエージングされますが、実際には、コードを適用することによってエージングされることは決してありません。 リンク、レベル 2 レベル 2 (リンク レベル) は、トランスポート層のサービスと製品を提供します。 Link、Listener、NetworkAddress、Packet などのこの段階のオブジェクトは、接続を設定し、そのあるレベルでいくつかのメッセージを送信する必要がある重要な部分をアサートします (決定 9 を参照)。
- Packet: これが私たちの最も重要なメッセージ構築です — get シリアライゼーション/デシリアライゼーションを (純粋なデジタル概念を通じて) ロボットによって管理する拡張可能なオブジェクトです。リンクオブジェクトのあるレベルでディスパッチされたとき。 リンク:
- 2 つのネットワーク エンドポイント間の接続。 これは、ループバック リンクである可能性もあります。この場合、エンドポイントはそれぞれ同一のマシン上にあります。 リンク上のシップ アンド ゲインの概念は、Packets とさらに voidrecordsdata バッファーを使用して特性を引き寄せることを知っています。 リスナー: リンクジェネレーター。 このオブジェクトは着信接続をリッスンし、接続が確立されるとリンクを生成します。 ファイル循環: これは、特定のリンクのあるレベルでの任意の計測可能な記録データ循環です — 例として、ファイル転送を強制するためにエージングされます. Win Address: プロトコルは単なるネットワークアドレス指定オブジェクト
- Ping: 簡単な ping クラス。 特定のリンクでのネットワーク遅延レベルのエクスペリエンス。
- 人間が読みやすく、テスターが理解できるようにする ボトルネック、スローダウン、および問題を隠す 影響が少なく、作業中ずっと節約できます。