私はマルチプレイヤー ゲームを作成しています。すべてのフレームで、プレイヤーの位置をサーバーに送信する必要があります。サーバーでは、他のすべてのプレイヤーの位置を応答として受け取ります。
コードをノンブロッキングにするために、次の行を追加しました。
u_long one = 1; // Giggety
ioctlsocket(sock, FIONBIO, &one);
しかし、問題は、独自のブロック コード (while ループ) を有効にしない限り、サーバーから他のプレイヤーの位置を受信できないことです。
while(recvfrom(sock, receiveBuffer, 255, 0, (struct sockaddr *)&server, &sockaddr_in_sizePtr) <= 0) {
}
// Do stuff with response
しかし、私がこれを行うと、応答が得られるまでローカル ゲームが実行されないため、ゲームの遅延が非常に大きくなります。
解決策は、while ループで表示関数を呼び出すことだけだと思いましたが、何もしていないようです。
もう 1 つの問題は、UDP ソケットを使用していることです。これは、データが届かない可能性があることを意味し、その場合はタイムアウトする必要があります。だから私はこれを追加しました:
time_t timer;
time(&timer);
while(recvfrom(sock, receiveBuffer, 255, 0, (struct sockaddr *)&server, &sockaddr_in_sizePtr) < 0) {
display(); // Doesn't stop lag
if(timer != time(NULL)) return;
}
しかし今では、文字通り 1 秒あたり 1 フレームの場合があります。これはひどいです。
ゲームを実行し続ける方法と、同時にソケットをリッスンする方法について、誰かが光を当てることができますか?