同じプロセス内でサーバーとクライアントの両方を実行する


9

質問

Lidgrenとネットワーキングを初めて使用し始めたばかりで、同じプロセス内でサーバーとクライアントの両方を実行することが可能であることに気付きました。

何らかの理由でこの習慣は推奨されませんか?

環境

私が尋ねている理由は、この概念によって、シングルプレイヤーモードとマルチプレイヤーモードの両方を同じものとして扱うことができると理論的に考えたからです。これは非常に役立ちます。

私の考えに従って、これは私が考えていたディストリビューションです:

  • シングルプレイヤー-同じプロセスで1つのサーバー+ 1つのクライアント。通信速度はどれくらいですか?
  • マルチプレーヤー-ホストのシングルプレーヤー+ 他の各プレーヤーの1つの追加クライアントと同じです。

私が描写している実行フローは、クライアントがユーザー入力を受け取り、サーバーに通知を送信するためのものです。次に、サーバーはそれを検証し、すべてのクライアントによって実行されるアクションをブロードキャストします。クライアントが1つ(つまり、シングルプレイヤー)であっても、複数のクライアント(つまり、マルチプレイヤー)であっても、問題にはなりません。

回答:


7

これは基本的にはプロセスとスレッドの質問です。どちらもそれほど違いはなく、スレッドは軽量プロセスと呼ばれることもあります。最大の違いは、別のプロセスには独自のアドレス空間があることですが、他の違いがあります(1)。

プロセスごと

  • アドレス空間
  • グローバル変数
  • ファイルを開く
  • 子プロセス
  • 保留中のアラーム、割り込み、シグナルハンドラ

スレッドごと

  • プログラムカウンター
  • 登録
  • スタック
  • 状態

これらの違いに基づいて、ファイルハンドルとグローバル変数を共有できるように、サーバーとクライアントのスレッドを同じプロセスに置くと便利です。これは、「同じプロセスで」のアプローチに対する議論であり、別の(小さな)議論は、プロセスごとに1つの「Windowsファイアウォール」ポップアップしか表示されないというものです。「異なるプロセス」アプローチの議論は、人が複数のクライアントを実行する必要なしに複数のサーバーを実行できるということでしょう。これは、セットアップのような専用のホストにとって理想的であり、私たちが一人称シューティングでよく目にするアプローチです。

オフラインプレイ(さらにはシングルプレイヤー)でもサーバープロセスまたはスレッドを使用するというアイデアは、実際によく使用されている素晴らしいアイデアです。ロード画面を見ると、多くのゲームがこれを行うことがわかります。「受信」のような小さなヒントは、それを提供します。マルチプレーヤーにする場合、ほとんどのゲームルールはサーバーによって管理されるので、これを行うのは理にかなっています。これにより、記述しなければならないコードが削減され、クライアントと「ゲーム」が明確に分離され、コードの品質が向上します。

では、プロセスとスレッド間の通信についてはどうでしょうか。プロセス間通信は、(名前付き)パイプ、共有メモリ、COMなど、さまざまな方法で実行できます。これは、実際に使用しているテクノロジに依存します。ただし、サーバーを作成している場合は、ソケットやTCPのようなものを使用したネットワーキングバリアントを使用することをお勧めします。これはもちろんLIDGRENが役に立ちます。

これらのテクニックの多くは、スレッド間通信にも有効です。しかし、これはあなたが使用しているテクニックにさらに依存します。再びTCPを使用することもできますが、おそらくこれよりも単純なシステムはイベントとマーシャリングですが、これによりゲームのループが非決定的になる可能性があります(2)。

出典

  1. オペレーティングシステムの設計と実装(MINIX本)、Andrew S. Tanenbaumによる第3版
  2. Glenn Fiedlerによるタイムステップの修正:http : //gafferongames.com/game-physics/fix-your-timestep/

1
私の唯一の追加は、リモートクライアントと同じコードを使用してローカルクライアントをローカルサーバーとシームレスに連携させ、このクライアントが同じコードを再度使用してリモートサーバーに接続するようにする場合です。 1)サーバーのプロセスを使用し、2)これは一般的な特徴であるため、ネットワークを使用します。とにかく、トランスポートコードの2つのバージョンを書く気がしない限り=)
Patrick Hughes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.