首先,我要为我的英语不好而道歉:)
昨天,我完成了使用Winsock和Allegro5用C++编写的第一个多人游戏(Pong)。游戏包含一台服务器,可为所有玩家和客户使用。

每帧(FPS = 60)客户端将其mouse_y坐标发送到服务器,服务器将它们分别传递给对手的客户端。当我在连接到其中一台服务器上的两台计算机上玩游戏时,通过本地网络,它可以完美运行,对手的球拍正在平稳移动。但是,当我通过外部IP地址进行相同的连接时,对手的球拍将滞后,这会破坏游戏,因为是客户端检查球是否击中了对手的球拍。这样,同步就被破坏了,每当我移动一个球拍在另一台计算机上弹跳球时,它就会滞后,并且不能及时为对手得分。……但这并不是游戏滞后。我的球拍和球都在平稳移动。问题仅在于对手的球拍。

我是网络编程的新手,因为我只读过Beej's Guide to Network Programming
我使用TCP套接字发送桨的send()和recv()坐标,并使用select()函数轮询套接字以获取数据。

我不知道可能是什么原因。

TL; DR:当我通过外部IP连接时,对手的拨片滞后,但当我通过本地IP连接时却没有。

最佳答案

扩展托马斯所说的话。我要给你一些实际的答案。

  • 将UDP用于游戏。


  • 如果您坚持使用TCP,请执行这些操作。
  • 降低的值TCPAckFrequency
  • 禁用nagle的算法,因为您的请求将很小。通过将 TCPNoDelay 设置为1来做到这一点。
  • 缓和两点之间的运动。
  • 在打包其余数据时发送较少的数据。
  • 将收到的数据包转换为结构。
  • 不要使用select。连接约50次后,您会注意到huge性能下降。对于Windows / Linux,分别使用epollIOCP
  • 关于c++ - 为什么在我的多人乒乓球比赛中对手的桨板滞后?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18032795/

    10-11 19:42