代码之家  ›  专栏  ›  技术社区  ›  Nick Retallack

网络游戏中的延迟处理

  •  27
  • Nick Retallack  · 技术社区  · 16 年前

    最初,我只是将玩家的输入发送到服务器,在那里进行模拟,并向所有玩家广播游戏状态的变化。这使得作弊变得困难,但在高延迟情况下,事情有点难以控制,因为你不会立即看到自己行为的结果。

    This GamaSutra article 有一个解决方案,通过在客户端上进行模拟,可以节省带宽并使本地输入看起来平滑,但它似乎将防作弊功能抛到了窗外。此外,我不知道当玩家开始操纵环境、推石头之类的东西时该怎么办。这些以前中立的对象将临时成为客户端需要发送PDU的对象,或者可能是多个玩家同时发送的对象。谁的PDU会赢?什么时候每个玩家会停止双重追踪这些物体(与推算的版本相比)?天堂禁止两名选手参加相扑比赛(例如,开始互相推搡)。

    This gamedev.net bit 显示了gamasutra解决方案的不足,但描述了一种不同的方法,它并不能真正修复我的协作推石示例。我发现的大多数其他东西都是针对枪手的。我希望看到一些更适合像斯内斯·塞尔达这样的游戏,但更多的物理/动力。

    • 注意:这里我不是问物理模拟的问题——其他库也涉及到了这一点。尽管存在网络延迟,但这只是让游戏变得流畅和被动的策略。
    5 回复  |  直到 16 年前
        1
  •  21
  •   Cristian Sanchez    16 年前

    检查阀在源引擎中是如何工作的: http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

    如果是第一人称射击,你可能需要深入研究他们提到的一些主题,例如:预测、补偿和插值。

        2
  •  11
  •   Vaillancourt    5 年前

    我发现 this network physics blog post 格伦·费德勒(Glenn Fiedler),下面的回应/讨论更是令人惊叹。这相当长,但值得一试。

    总之

    当在现代游戏物理模拟(即车辆或刚体动力学)中收到客户端输入时,服务器无法跟上重复模拟的步伐。因此,服务器在服务器之前命令所有客户端延迟+抖动(时间),以便在服务器需要它们之前,所有输入数据包都以JIT方式到达。

    论欺骗

    @CD Sanchez' answer

    非常清楚:服务器不容易欺骗,因为它及时接收到网络物理定位(而不是像传统预测那样晚x毫秒)。客户端根本不会受到影响,因为它们都会以与传统预测完全相同的延迟接收对手的位置信息。

    无论你选择哪种算法,如果你要发布一个主要的标题,你可能会想要添加欺骗保护。如果是的话,我建议添加针对 stooge bots an XOR stream cipher

    如果你只是在做一个小的独立游戏,可能只有几千人玩,那么在1)你需要它们之前,不要费心实现任何反作弊算法;或者2)用户群增长。

        3
  •  2
  •   Ted Bigham    9 年前

        4
  •  0
  •   Joel Martinez    16 年前

    在XNA创作者俱乐部网站上查看网络教育主题。它深入研究了网络体系结构(对等或客户机/服务器)、网络预测和其他一些问题(当然是在XNA的上下文中)。这可能会帮助你找到你正在寻找的答案。

    http://creators.xna.com/education/catalog/?contenttype=0&devarea=19&sort=1

        5
  •  0
  •   Andrioid    15 年前

    您可以尝试对所有客户端施加延迟,具体取决于该区域的平均延迟。这样,客户机可以尝试解决延迟问题,大多数玩家都会有类似的感觉。

    简而言之如果您有3名玩家:

    • 约翰:30毫秒
    • 保罗:150毫秒
    • 艾米:80毫秒

    在计算之后,不是同时将数据发送回客户端,而是考虑它们的延迟,然后开始在John之前发送给Paul和Amy。

    但这种方法在极端的延迟情况下是不可行的,因为拨号连接或无线用户可能会给每个人都带来麻烦。但这是一个想法。