我正在考虑制作一款网络游戏。我对此有点陌生,并且已经遇到了很多问题,试图为航位推算和网络延迟制定一个好的计划,所以我很想看到一些关于这个主题的好的文献。我将描述我考虑过的方法。
最初,我只是将玩家的输入发送到服务器,在那里进行模拟,然后将游戏状态的变化广播给所有玩家。这使得作弊变得困难,但是在高延迟的情况下,事情有点难以控制,因为您不会立即看到自己操作的结果。
This GamaSutra article有一个解决方案,可以节省带宽,并通过在客户端上进行模拟来使本地输入看起来流畅,但似乎可以防止作弊。另外,我不确定当玩家开始操纵环境,推动岩石等时该怎么办。这些以前中立的对象将暂时成为客户端需要向 PDU 发送的对象,或者可能是多个玩家一次发送的对象。谁的 PDU 会与被双重跟踪的玩家进行比较?
This gamedev.net bit显示 gamasutra 解决方案是不够的,但描述了一种不同的方法,它并不能真正解决我的协作巨石推动示例。我发现的大多数其他东西都是针对射击者的。我希望看到更适合像 SNES Zelda 一样玩的游戏,但涉及更多的物理 / 动量。
注意:我不是在这里询问物理模拟-其他库已经涵盖了。只是使游戏流畅和反应性的策略,尽管网络延迟。
查看 Valve 如何在源引擎中执行此操作:http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
如果是第一人称射击游戏,您可能必须深入研究他们提到的一些主题,例如:预测,补偿和插值。
我发现 Glenn Fiedler 的this network physics blog post,甚至更多,因此下面的响应 / 讨论,真棒。这是相当漫长的,但值得的。
In summary
每当在现代游戏物理模拟(即车辆或刚体动力学)中接收到客户端输入时,服务器都无法跟上重复模拟的步伐。因此,服务器会在服务器之前命令所有客户端延迟 + 抖动(时间),以便所有传入数据包在服务器需要之前都以 JIT 形式出现。
他还概述了如何处理您要求的所有权类型。他在 GDC 上展示的幻灯片很棒!
关于作弊
Fiedler 先生本人(和其他人)指出,该算法的缺点是不能很好地防止作弊。事实并非如此。与传统的客户端 / 服务器预测相比,该算法同样容易或难以利用(请参阅@CD Sanchez' answer中有关传统客户端 / 服务器预测的文章)。
要绝对清楚:服务器并不容易作弊,因为它及时接收网络物理定位(而不是像传统预测那样晚 x 毫秒)。客户端根本不受影响,因为它们都以与传统预测完全相同的延迟接收对手的位置信息。
无论您选择哪种算法,如果您要发布主要标题,都可能需要添加作弊保护。如果是,我建议添加针对stooge bots的加密(例如an XOR stream cipher,其中“密钥流是由伪随机数生成器生成的”)和针对调试漏洞的简单健全性检查。一些开发人员还实现了算法来检查二进制文件是否完好无损(以降低破解的风险),或者确保用户
如果你只是制作一个较小的游戏,可能只有几千个玩家玩,不要费心实施任何算法,直到 1)你需要它们;或 2)用户群增长。
我们已经实现了基于强务器和进行预测的远程玩家的多人蛇游戏。服务器每 150 毫秒 (在大多数情况下) 发回一条消息,其中包含每个远程玩家发送的所有合并动作。如果远程客户端移动延迟到达服务器,他将丢弃它们。客户端将重放最后一个动作。
在 XNA Creator 's Club 网站上查看 Networking 教育主题。它深入研究了网络架构 (对等或客户端 / 服务器) 、网络预测和其他一些主题 (当然是在 XNA 的背景下)。这可能会帮助您找到您正在寻找的答案。
http://creators.xna.com/education/catalog/?contenttype=0&devarea=19&sort=1本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(15条)