私はHalf-Life 2のマルチプレイヤープロトコルがCounter-Strike:SourceやDay of Defeat:Sourceのようなモッドでどのように機能するのだろうと思っていました。私は彼らがある種の難読化と独自の圧縮アルゴリズムを使用していると信じています。パケットの中に異なる種類のメッセージがどのようにコード化されているかを知りたい。Half-Life 2マルチプレーヤープロトコルはどのように機能しますか?
答えて
ハーフライフ2、カウンターストライク:ソースなどはすべてバルブソースエンジンを使用します。バルブは、多くのものをカバーdeveloper wikiを持っている...
をこれらの記事は、あなたが興味かもしれません(そのかなりクールそれをチェックアウト!):
Latency Compensating Methods in Client/Server In-game Protocol, Design and Optimization
これは本当に複雑な問題であり、私の提案は、オープンソースのネットワークゲームエンジンのいくつかを見て次のようになります。
- http://www.hawksoft.com/hawknl/
- http://www.zoidcom.com/
- http://sourceforge.net/projects/opentnl
- http://www.gillius.org/gne/
また、ソースを見ることもできますオリジナルの半減期エンジンが基づいている地震シリーズのコード。
Quakeエンジンのブランチに重点を置いています。その中には、Half-Lifeとの互換性の点までビルドアップしたものもあります。 FTEQuakeWorldやTomazQuakeのようなエンジンは良い飛び降り点かもしれません。 –
@A。 Scagnelli、Sourceエンジン(Half-Life 2のエンジン)は、Quakeエンジンに基づいていません。だから、基本的なクライアントサーバーの概念を学ぶのは良いでしょうが、それはあなたに正確なコードを与えるつもりはありません。 –
エンジンのライセンス供与を除いて、正確なコードは何も表示されません。ソースエンジンはQuake Engineのルーツを持っています。 – Aistina
詳細は異なるかもしれないが、一般的なフレームワークはかなり古いです。ここで概要を簡単に説明します:
doomやQuakeなどの初期のfpsゲームでは、あなたの移動コマンドに対するサーバーの応答でプレーヤーの位置が更新されました。つまり、前進ボタンを押した後、クライアントがサーバーにその情報を伝えた場合、サーバーは自分の位置を記憶に追いやって、新しい位置でクライアントに新しいゲーム状態を中継します。これは非常に遅い遊びにつながりました。撮影、狭い廊下を移動することさえも、遅れを予測するゲームでした。
新しいゲームでは、クライアントがプレーヤーの撮影と移動を単独で処理できるようになりました。これは遅れのない動きと火災につながりましたが、クライアントのコードをハッキングすることで不正行為の可能性をさらに広げました。すべてのプレイヤーは、自分のコンピュータ上で独立して移動して発砲し、サーバーに行ったことを伝えます。これは、2人のプレーヤーがお互いにぶつかり合ったり、同時に電源を入れようとするときに壊れます。
これで、サーバーには各プレーヤーからのこのクライアント状態ストリームがあり、それらを同期させて一貫性のあるゲームを作成する必要があります。トリックは各プレーヤーのレイテンシを測定することです。究極の目標は、敵が横に動いて、それが正しく命中するように、非常に低いレイテンシーの武器(スナイパーライフルやレールガンなど)を発射できることです。各プレイヤーのレイテンシが分かっている場合、プレーヤーA(レイテンシ50ms)がBのガンを発射したとします(レイテンシ60ms)。ヒットするには、ショットはBが60ms前、ここでAは50ms前からBになる必要があります。
これは非常に概要がわかりますが、一般的な考え方を示す必要があります。
これは、異なる種類のメッセージがパケット内でどのように符号化されるかを説明しません。 – JtR
"すべてのプレイヤーは、自分のコンピュータ上で独立して移動して発砲し、サーバーと通信します。これは、少なくとも半減期1では真実ではありません。クライアントは、同じシミュレーションをローカルで実行してゼロラグの錯覚を作成することができますが、サーバーは完全な状態ではなく通常は制御入力を受け取ります。サーバーはまた何が起こっているかについて最後の言葉を残しているので、クライアントはこれを使ってゲームルールを破ることはできません –
ハーフライフでLuigi Auriemmas papersをチェックしてください。パケットデコーダとその中のいくつかの逆アセンブルされたアルゴリズムも見つかります。
ハーフライフ2のリバースエンジニアリング情報は、不正行為との関連性があるため、やむを得ない場合があります。私はmpcforumのようなボードはあなたの最善の策だと思います。
正確な答えが含まれていなくてもこれまでのところ最高の答えです。少なくとも私はこのフォーラムからこれについて知ってくれる誰かを見つける機会があります。ありがとうございます! – JtR
私は、Quake 1-3エンジンを調べることをお勧めします。それらはソースコードで利用可能です。半減期のプロトコルは多少異なるかもしれませんが、おそらく十分に近いでしょう。
- 1. JSF 2 ConversationScopeはどのように機能しますか?
- 2. 角度2 - プロバイダは実際にどのように機能しますか?
- 3. dropbox.comの複数のファイルアップロード機能はどのように機能しますか?
- 4. JQueryのdatepickerのポップアップ機能はどのように機能しますか?
- 5. jqueryのshow/hide機能はどのように機能しますか?
- 6. 機能の削減はどのように機能しますか?
- 7. セッターテンプレートのライブライブテンプレート機能はどのように機能しますか?
- 8. Facebookのリンク機能はどのように機能しますか?
- 9. Pythonの "all"機能はどのように機能しますか?
- 10. 豚の置換機能はどのように機能しますか?
- 11. JavaScriptのパワー機能はどのように機能しますか?
- 12. Readerモナドの「質問」機能はどのように機能しますか?
- 13. この機能割り当てはどのように機能しますか?
- 14. Safariのリーダー機能はどのように機能しますか?
- 15. AddImplicitRequiredAttributeForValueTypesが実際にどのように機能し、どのように機能していますか?ここ
- 16. Node.jsでは、イベントループはどのように機能しますか?
- 17. reduceLeftで型推論機能はどのように機能しますか?
- 18. ポーリング機能はどのようにcで機能しますか?
- 19. JavaScript []は本当にどのように機能しますか?
- 20. ブートストラップグリッドは実際にどのように機能しますか?
- 21. WPAは実際にどのように機能しますか?
- 22. UpdatePanelは実際にどのように機能しますか?
- 23. このPythonコードはどのように機能しますか?
- 24. NSObjectの継承はどのように機能しますか?
- 25. surfaceflingerのインターフェースはどのように機能しますか?
- 26. このコードはどのように機能しますか? [HARD]
- 27. WPFのNameScopeはどのように機能しますか?
- 28. Androidのスキャナはどのように機能しますか?
- 29. WebAudio:setTargetAtTimeのtimeConstantはどのように機能しますか?
- 30. このJSコピートリックはどのように機能しますか?
ここではネットワークプロトコルが正しいとは思わないので、タグを削除しました。 –
JtRが求めているようなものだから、タグを読んだ。 –