在线游戏客户端如何通过互联网快速交换数据?

24

让我们想象一个非常简单的游戏... 我们有一个迷宫和两个玩家试图通过互联网实时找到出口。

在每一步中,游戏客户端都应将玩家坐标发送到服务器并接受另一个客户端的当前坐标。如何使这种交换如此之快(就像所有现代游戏一样)。

好的,我们可以使用memcache或类似的技术来减少服务器端的数据挖掘操作。我们还可以使用最快的Web服务器等,但我们仍然会遇到时序问题。

那么问题是...

  1. 游戏客户端通常使用什么协议与服务器交换信息?
  2. 哪些服务器技术正在解决这个问题?
  3. 应用于解决游戏延迟的算法有哪些?
3个回答

9

Valve仍然按照那篇论文所描述的方式执行。 - Crashworks

8
  • 使用UDP而不是TCP
  • 使用自定义协议,通常是一个字节定义一个"命令",并尽可能少地包含命令参数的后续字节
  • 预测用于使其他玩家的移动看起来平滑,而无需为每个帧获得更新

提示:无论如何都会使用预测来平滑快速的屏幕更新(~60fps),因为实际游戏速度通常较慢(~25fps)。


这并不像使用UDP覆盖TCP那么简单。TCP提供了许多非常有用的功能,如果使用UDP,你将不得不自己构建这些功能。TCP只有在出现数据包丢失的情况下才会出现问题,而这种情况在现今相当罕见。许多大型MMO游戏都使用TCP。只有在你的游戏在数据包之间偶尔出现长时间延迟(由于重发丢失的数据包)时,才需要使用UDP。在决定使用UDP之前,请仔细考虑。 - Robert Basler
2
Robert:UDP被广泛应用于许多在线FPS游戏中——它是最快速的可用网络协议,因为您不希望等待TCP重新发送数据包并检查队列完整性。我认为如果所涉及的游戏不需要某种完整性检查并且需要最快的响应时间,则该答案是有效的。 - scape

7
其他回答没有明确指出原帖中的一些重要误解,即这些游戏并不是网站,它们的运作方式有很大不同。具体来说:
  • 没有或几乎没有需要加速的“数据挖掘”。最快的在线游戏(例如第一人称射击游戏)通常在比赛期间不保存任何数据到磁盘上。较慢的在线游戏(例如MMO)可能会使用数据库,主要用于存储玩家信息,但它们大部分将玩家和世界数据存储在内存中,而非磁盘上。
  • 它们不使用Web服务器。HTTP是一种相对较慢的协议,即使仅使用TCP也可能对某些游戏来说太慢了。相反,它们有专门为特定游戏编写的专用服务器。通常,这些服务器被调整为低延迟而非吞吐量,因为它们通常不像Web服务器那样提供大型文档,而是许多微小的消息(例如按字节而非千字节测量)。
有了这两个问题的解决,您的速度问题基本上就消失了。您可以向服务器发送消息并在不到100毫秒的时间内获得回复,而且每秒可以多次这样做。

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