回答:
さて、まず第一に、何かがあり、それが機能している場合、通常はそのままにしておくことをお勧めします。壊れていないものを修正するのはなぜですか?
しかし、問題があり、実際にネットワークコードを書き直したい場合は、主に4つの選択肢があると思います。
多くのマルチプレーヤー(ピアツーピアから大規模マルチプレーヤーまで)のクライアントとサーバーを作成したので、オプション2を使用すると、サーバーとクライアントの両方のゲーム部分で、複雑さが最小限になり、パフォーマンスがかなり向上すると思います。間もなく、オプション4を使用しますが、通常はプログラム全体を再考する必要があります。ほとんどの場合、クライアントではなくサーバーで使用すると便利です。
特に、マルチスレッド環境でソケットをブロックすることはお勧めしません。そうすると、通常、ロックやその他の同期機能が発生し、コードの複雑さが大幅に増加するだけでなく、一部のスレッドが待機するため、パフォーマンスが低下する可能性があります。その他。
しかし、何よりも、ほとんどのソケット実装(およびその時点でのほとんどのI / O実装)は、最低レベルで非ブロッキングです。ブロッキング操作は、単純なプログラムの開発を単純化するために提供されているだけです。ソケットがブロックしているとき、そのスレッドのCPUは完全にアイドル状態になっているので、すでに非ブロック化タスクの上にブロック化抽象化の上に非ブロック化抽象化を構築するのはなぜですか?
ノンブロッキングソケットプログラミングは、試していないと少し気が遠くなるかもしれませんが、非常に簡単で、すでに入力ポーリングを実行している場合は、ノンブロッキングソケットを実行するという考え方を持っています。
最初に行うことは、ソケットを非ブロッキングに設定することです。あなたはそれをしfcntl()
ます。
その後、あなたが行う前にsend()
、recv()
、sendto()
、recvfrom()
、accept()
(connect()
少し異なっている)、またはスレッドをブロックすることができ、他の呼び出し、お電話select()
ソケットに。select()
後続の読み取りまたは書き込み操作を、ブロックせずにソケットで実行できるかどうかを示します。その場合は、必要な操作を安全に行うことができ、ソケットはブロックしません。
これをゲームに含めるのは非常に簡単です。たとえば、次のようなゲームループが既にある場合:
while game_is_running do
poll_input()
update_world()
do_sounds()
draw_world()
end
次のように変更できます。
while game_is_running do
poll_input()
read_network()
update_world()
do_sounds()
write_network()
draw_world()
end
どこ
function read_network()
while select(socket, READ) do
game.net_input.enqueue(recv(socket))
end
end
そして
function write_network()
while not game.net_output.empty and select(socket, WRITE) do
send(socket, game.net_output.dequeue())
end
end
リソースの面では、本棚に1冊しかないと思う本は、亡くなったRichard Stevensによる「Unix Network Programming、Vol 1」だけです。Windowsや他のOS、言語ソケットのプログラミングを行うかどうかは関係ありません。この本を読むまで、ソケットを理解しているとは思わないでください。
マルチソケットプログラミング(主にサーバープログラミングに関連)に関して利用可能なソリューションの一般的な概要を見つけることができるもう1つのリソースは、このページです。
使用しているプログラミング言語を記述していませんが、ほとんどの言語は、基盤となるオペレーティングシステムの機能を利用することが多い、優れた非同期ソケットフレームワークを提供しています。
ブロッキングソケットに基づいて独自のスレッド化された実装を作成する場合(複数のクライアントがある場合は、すべての単一ソケットにスレッドが必要です)、非同期ソケットフレームワークがすでに提供しているものを再発明します。
したがって、非同期ソケットを使用することをお勧めします。
N
クライアントにサービスを提供していますか?ブロックしていて、残りのソケットの状態に関係なく、各ソケットのデータが処理されるようにするには、ソケットごとに1つのスレッドが必要です。または、ブロッキングソケットを使用しないでください。