我正在制作一个多人游戏,每一帧,玩家的位置都必须发送到服务器,服务器会收到所有其他玩家的位置作为响应。
我添加了这一行以使我的代码非阻塞:
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 循环中调用我的显示函数,但这似乎没有任何作用。
另一个问题是我正在使用 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 帧。这太可怕了。
有人可以阐明如何保持游戏运行并让它同时监听套接字吗?