首先,我想为我糟糕的英语道歉:)昨天,我用Winsock和Allegro5在Allegro5上完成了我的第一个多人游戏(Pong)。游戏由一台服务器组成,供所有玩家和客户使用。
每个帧(FPS = 60)客户端将其mouse_y坐标发送到服务器,服务器分别将它们传递给对手的客户端。当我在我的2台电脑上玩游戏,连接到服务器上,服务器在其中一台上运行,通过本地网络,它完美地工作,对手的桨移动得很平稳。但是当我通过我的外部IP地址进行同样的连接时,对手的桨是滞后的,这破坏了游戏,因为是客户来检查球是否击中了对方的桨。因此,同步性被破坏了,每当我移动一只桨在另一台电脑上弹起球时,它就会延迟,不能及时使它为对手得分.但落后的不是游戏。我的桨和球进展得很顺利。问题只在对手的桨上。
我对网络编程很陌生,因为我只读过Beej网络编程指南。我使用TCP套接字发送()和recv()坐标的桨和选择()函数来轮询套接字的数据。
我一点也不知道原因是什么。
TL;DR:当我通过外部IP连接时,对手的桨会滞后,但是当我通过本地IP连接时,它就不会了。
发布于 2013-08-03 12:57:28
来扩展托马斯的话。我会给你一个更实际的答案。
如果您坚持使用TCP,那么就这样做。
select。在大约50个连接之后,您将注意到huge性能的损失。在Windows/Linux中分别使用epoll或IOCP。发布于 2013-08-03 12:30:49
嗯,这是完全可以预料的行为,它是由光速决定的。通过互联网发送的数据包只需一段时间就能到达:
$ ping stackoverflow.com
PING stackoverflow.com (198.252.206.16) 56(84) bytes of data.
64 bytes from stackoverflow.com (198.252.206.16): icmp_req=1 ttl=53 time=85.1 ms这告诉我从我的机器到stackoverflow.com的往返时间是85毫秒,这对一个网站来说是很好的,但足以在一个实时游戏中造成明显的滞后。
这是坏消息。更坏的消息是,这是一个很难解决的问题。
专业的实时多人游戏使用几个技巧,使滞后不太明显。例如,他们跟踪每个客户端的延迟,并尝试“预测”播放器在当前时间点的位置,即使这些数据包尚未到达。但当然,如果数据包到达,预测结果是错误的,这将导致玩家突然“跳跃”到正确的地方。为了解决这个问题,他们在预测的位置和最后的已知位置之间进行了一些平滑处理。如果做得好,这就产生了实时运动的错觉。
另一个问题是,您不能只在客户端上执行游戏逻辑,因为每个客户端对世界的看法都略有不同。让客户端做预测是可以的,但是服务器应该有最终的决定权来决定桨是否击中球。
https://stackoverflow.com/questions/18032795
复制相似问题