一个基于客户端服务器的多人游戏,最佳更新频率是多少?

6
我正在使用C++制作一款多人游戏:
客户端只需接收用户的命令,计算其玩家的新位置并将其发送到服务器。服务器接受所有客户端的位置更新,并将每个位置广播给所有客户端。在这种情况下,应该由哪些参数确定连续更新之间的时间间隔(我不想有太多更新,从而使网络拥塞)。我认为,客户端中的最大ping应该是其中一个贡献参数。
其次,如何确定客户端的ping /延迟?论坛上的其他帖子建议使用“原始套接字”或使用系统的ping命令并从文件中收集输出..他们是否意味着使用类似于system('ping "client ip add" > file')或分叉和执行ping命令..

5
首先,你的基本概念存在缺陷。发送指令到服务器,而不是位置。否则,你将会遇到更多的作弊行为。其次,更新速率取决于你的游戏类型,在我 http://github.com/BonsaiDen/NodeGame-Shooter 这个项目中,50-300毫秒就足够了。更新之间的时间间隔越长,你需要进行的插值操作就越多。 - Ivo Wetzel
Ivo,你说得对,如果我发送位置信息,那么欺骗客户的空间就很大了。但是我想到了一个办法,因为我使用UDP来发送这些更新数据包,如果“位置”更新在传输中丢失,那么对游戏造成的损害不会像“命令”更新丢失那样严重,否则我还必须定期与每个客户端同步他们的正确位置...你是否也建议更新频率不应该是网络性能的函数(例如,如果网络负载很重/相对空闲)? - AnkurVj
如果你以玩家的ping为基础来计算频率,那么某个人只需增加自己的ping就能轻易地减缓整个游戏的速度。你做过一些测试吗?UDP是一个基本要求吗?那非位置相关的东西呢?比如开火、施法、点击UI等。你也想用UDP吗?这样会导致大量的客户端逻辑和疯狂的服务器端验证代码。 - Ivo Wetzel
无论我在哪里阅读,他们都告诉我必须使用UDP来发送更新数据包,因为它们将是频繁且实时的(丢失数据包比延迟数据包更好,对吗?)。虽然您提出了客户端可以处理的命令类型的可扩展性的严重问题..(服务器检查越来越复杂),那么解决方案是什么?只从客户端向服务器发送命令,然后通过定期同步更新来保持宇宙同步吗? - AnkurVj
发送命令是正确操作的最简单方式,而正确操作总比仅仅让它们执行得好要更好。我不知道你的游戏规模如何,但我建议你首先使用TCP。由于似乎这是你的第一个多人游戏项目,更重要的是你掌握需要保持世界安全和同步的概念。像魔兽世界这样的游戏将使用TCP和UDP的混合,但请记住,他们拥有1000倍的经验和100倍的人员来编写服务器端和客户端检查(例如监视游戏进程的Warden)。 - Ivo Wetzel
3个回答

4
这个答案的内容取决于你所说的多人游戏类型。听起来你在谈论一种类似于MMO的游戏。如果是这样,那么使用“短暂通道”将是明智的选择,即客户端可以每秒生成多个移动数据包,但只有最近的移动数据包会被发送到服务器。如果你使用这样的技术,那么你应该基于游戏中玩家移动的速度来确定更新率。通过这样做,你可以确保玩家不会穿过墙壁或者太快地跑过触发器。
对于你的第二个问题,我建议使用boost::asio来设置一个服务,让你的客户端可以通过发送一个简单的数据包进行“ping”,然后服务会向客户端发送一个消息,你可以确定它返回数据包所需的时间。

这个建议非常有道理,但在我的情况下并不适用。在我的游戏中,客户端发送其玩家的位置,服务器还根据此位置以及场景中其他玩家和物体的位置进行一些计算。如果客户端仅发送部分位置更新,则服务器不总是知道客户端的准确位置,因此可能执行不正确的计算。 - AnkurVj
2
@AnkurVj:为什么客户端要发送玩家的位置?这里有什么不寻常的要求吗?通常情况下,客户端会发送玩家命令,而服务器会确定位置等信息。否则,人们将会通过黑客手段或连接方式随意改变自己的位置。 - David Thornley
1
@David Thornley:你说得非常正确,玩家很容易通过黑客手段或者速度加速等方式来修改他们的客户端。@AnkurVj:你可能需要重新考虑你的设计,服务器确实需要成为玩家位置的最终权威。 - Kyle C
@Kyle,David,绝对是一个有效的观点,请看我的问题下的评论 - AnkurVj
顺便说一下,ASIO 的“计时器”功能会对我很有帮助,不错。 - AnkurVj
对于移动,通常客户端会发送其声称的位置,服务器会进行验证。发送“命令”在精细的移动活动中效果不佳。当使用UDP时,这一点尤为重要,因为您不希望重新传输此类数据。 - Kylotan

0

0

enet库为您处理了许多网络方面的工作,同时还能计算延迟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接