【发布时间】:2010-10-18 14:47:47
【问题描述】:
我正在用 c++ 制作多人游戏:
客户端只需从用户那里获取命令,计算玩家的新位置并将其传达给服务器。服务器接受来自所有客户端的此类位置更新,并对每个客户端进行相同的广播。在这种情况下,哪些参数应该确定连续更新之间的时间间隔(我不想要太多更新,因此阻塞了 n/w)。我在想,客户端之间的最大 ping 应该是贡献参数之一。
其次,我如何确定客户端的这种 ping/延迟?该论坛上的其他主题建议使用“原始套接字”或使用系统的 ping 命令并从文件中收集输出.. 他们的意思是使用 system('ping "client ip add" > file') 之类的东西还是分叉和执行 ping 命令..
【问题讨论】:
-
首先你的基本概念是有缺陷的。将命令发送到服务器,而不是位置。否则你最终会遇到比你想象的更多的骗子。其次,更新率取决于你的游戏类型,以我的github.com/BonsaiDen/NodeGame-Shooter 为例,50-300ms 就足够了。更新之间的时间跨度越大,您需要做的插值就越多。
-
Ivo,你说得对,如果我发送位置,欺骗客户的空间很大,但我认为,由于我使用 UDP 发送这些更新数据包,如果“位置”更新丢失在运输过程中,对游戏的损害不会像'commans'更新丢失那样严重,在这种情况下,我还必须定期与每个客户保持正确的位置同步......你是否也建议更新频率不应该是网络性能的函数(例如,如果网络负载很重/相对空闲)?
-
如果你根据玩家的 ping 频率来确定频率,那么有人很容易通过增加他的 ping 来减慢整个游戏的速度。你做过一些测试吗? UDP是基本要求吗?非职位的东西呢?就像开火、施法、点击 UI 一样。你也想使用 UDP 吗?这样你最终会得到大量的客户端逻辑和大量疯狂的服务器端验证代码。
-
我读到的每一个地方,他们都告诉我我必须使用 UDP 来发送更新数据包,因为它们会频繁且实时(丢失的数据包比延迟的数据包更好,对吗?)。尽管您已经提出了有关客户端可以处理的命令类型的可伸缩性的严重问题..(服务器检查变得越来越复杂)。那么解决方案是什么?仅将命令从客户端发送到服务器,然后还通过发送定期同步更新来保持 Universe 同步?
-
发送命令是把事情做好的最简单的方法,把事情做好总是比让他们表现好要好。我不知道您的游戏规模,但我建议您首先使用 TCP。由于这似乎是您的第一个多人游戏项目,因此掌握保持世界安全和同步所需的概念更为重要。像《魔兽世界》这样的游戏会混合使用 TCP 和 UDP,但请记住,它们有 1000 倍的体验和 100 倍的人来编写服务器端和客户端检查(比如监视游戏过程的守望者)。