【问题标题】:Why does opponent's paddle lag in my multiplayer pong game?为什么我的多人乒乓球比赛中对手的球拍滞后?
【发布时间】:2013-08-03 12:18:47
【问题描述】:

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

每帧 (FPS = 60) 客户端将他们的 mouse_y 坐标发送到服务器,服务器分别将它们传递给对手的客户端。当我在连接到其中一台服务器的两台计算机上玩游戏时,通过本地网络它运行良好,对手的桨移动顺畅。但是当我通过我的外部 IP 地址进行相同的连接时,对手的球拍滞后,这会破坏游戏,因为它是客户端检查球是否击中对手的球拍。因此,同步被破坏了,每当我在另一台计算机上移动一个桨来反弹球时,它就会滞后并且没有及时完成,从而导致对手得分......但这不是滞后的游戏。我的桨和球移动得很顺畅。问题只出在对手的桨上。

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

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

TL;DR:当我通过外部 IP 连接时,对手的桨会滞后,但当我通过本地 IP 连接时则不会。

【问题讨论】:

    标签: c++ winsock lag allegro5 pong


    【解决方案1】:

    延伸托马斯所说的话。我会给你一个更实际的答案。

    • 在游戏中使用 UDP。


    如果你坚持使用 TCP,那就这样做吧。

    • 降低 TCPAckFrequency 的值。

    • 禁用 nagle 的 算法,因为您的请求会很小。通过将 TCPNoDelay 设置为 1 来做到这一点。

    • 简化两点之间的移动。

    • 在打包其余数据的同时发送更少的数据。

    • 将接收到的数据包转换成结构体。

    • 不要使用select。大约 50 次连接后,您会注意到 huge 性能损失。对于 Windows/Linux,分别使用 epollIOCP

    【讨论】:

    • 如果我将 TCP 套接字改为 UDP,是否真的可以加快数据传输速度到游戏可以玩的程度?
    • @user2648421 是的,几乎。 TCP 不适合游戏。此外,beej 的指南也不适合游戏。你应该买一本与多人游戏相关的书,并使用手册页来实现 sendto/recvfrom 等功能。
    • @user2648421 Beej 的指南会让你很困惑。尤其是在 select 是个坏主意的 Windows 上。
    • 游戏书?如果您碰巧记得任何标题,可以推荐给我吗?
    • @user2648421 对于游戏来说,这是一个很好的起点,devmaster.net/categories/articles
    【解决方案2】:

    嗯,这是完全符合预期的行为,是由光速强加的(除其他外)。通过 Internet 发送的数据包需要一段时间才能到达:

    $ 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 的 RTT(往返时间)为 85 毫秒,这对于网站来说还不错,但足以导致实时游戏出现明显的延迟。

    这是个坏消息。更糟糕的是,这是一个很难解决的问题。

    专业的实时多人游戏使用多种技巧来使延迟不那么明显。例如,他们跟踪每个客户端的延迟,并尝试“预测”玩家在当前时间点的位置,即使这些数据包尚未到达。但是当然,如​​果数据包到达并且预测结果是错误的,这将导致玩家突然“跳”到正确的地方。为了解决这个问题,他们在预测位置和最后已知位置之间应用了一些平滑。如果做得好,就会产生实时运动的错觉。

    另一个问题是您不能仅在客户端上执行游戏逻辑,因为每个客户端对世界的看法都略有不同。让客户端做预测是可以的,但是球拍是否击中球应该由服务器说了算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多