MMORPG客户端/服务器编码

13

UDP和TCP协议在MMORPG客户端/服务器通信中是如何使用的?

例如:

客户端通过UDP广播(玩家位置等)到服务器吗?还是反过来?

或者更像使用TCP,其中客户端请求服务器移动玩家。 服务器接收请求,移动玩家并将其发送回客户端,告知玩家现在的位置为xyz?

聊天频道必须使用TCP实现吗?

是否有关于此的好文章/书籍?我找到了一些内容,但似乎真正的实战经验才能获得更多的信息。

9个回答

8
很多游戏使用UDP进行与移动相关的活动,比如说当你走路时,很可能会发送一堆UDP请求。服务器仍然最终控制着这是否有效,但你不必关心每个数据包是否都到达了服务器。这就是为什么很多游戏客户端也使用某种预测机制的原因。
至于你提到的第二点,所有控制都由服务器管理是非常普遍的。你不希望客户端向服务器广播任何东西;你应该在服务器端进行错误和输入处理,以防止人们黑客攻击。你还可以限制每秒的输入次数。
总之,UDP和TCP的结合是适当的——你只需要问自己:“我想要可靠性还是速度?”

4

有许多不同的实现方式,但大部分都是这样的。几乎所有游戏世界中的操作都会重复这个模式。

  1. 客户端通知服务器玩家想要移动。
  2. 客户端根据它认为应该发生的情况显示玩家移动。
  3. 服务器验证移动是否可能发生,考虑到玩家的位置。
  4. 服务器更新客户端关于玩家在服务器上的位置。
  5. 客户端更新玩家的位置以反映服务器的世界状态。

4

不能依赖客户端传递真实信息。有人会入侵协议并作弊。加密数据无法阻止这种情况-只能使它变得更难。

客户端应该仅发送有关移动等请求,服务器需要检查这些请求以确保它们不违反游戏规则。服务器应仅返回客户端绝对需要的数据-不能依赖客户端获取一块世界数据并过滤掉玩家当前无法观察到的所有内容。有人将获得额外信息并利用它。

如果游戏需要“实时”,则客户端需要假定服务器将允许移动请求并相应地更新显示-如果服务器稍后更正,则回滚移动。在大多数情况下,客户端和服务器将达成一致,一切都将顺畅进行。当客户端试图作弊(这是他们自己的错)或由于连接不佳而严重滞后时,他们不会达成一致(对此你也没太多办法)。


1

你提出的问题(使用的传输层协议)一半可以通过安装Wireshark并查看流量来回答。


1

我认为现在这是RedDwarf Server。只是为了保持最新状态。 - Iulius Curt

1

我认为你可以通过阅读其他人如何实现这些类型的系统来学到很多东西。在这方面,我可以向你介绍 Tim SweeneyThe Croquet Consortium 的工作。

  1. Unrea Networking Architecture
  2. The Croquet Project

Tim Sweeney的论文改变了我对编程的看法。我强烈推荐他们。


0

我并不知道任何细节,只是作为一个玩家的观察,但大多数游戏肯定不会等待服务器回应才移动角色,除非是回合制。看起来的情况是移动由客户端完成并发送到服务器,然后服务器将这些消息发送给其他玩家。至少在魔兽世界中,如果一个玩家延迟了,你可能会看到他们仍然向前移动,然后在稍后神奇地出现在另一个位置,这说明客户端接收到的不仅是位置数据,还有他们正在移动的方向,并在缺乏进一步数据的情况下推断出移动。


0
你最好的选择可能是看一下Planeshift的网络编码,它是一个开源的MMO游戏。我相信它是目前为止最发达的(上次我检查时)。

0

我认为这个问题没有简短的单一答案,它的范围非常广泛。但还是有几点需要注意:

  • 使用UDP时没有必要“广播”。在我的经验中,UDP大多数情况下都是点对点的。
  • 完全可以通过UDP进行自己的“安全”通信,不必使用TCP。它并不神奇,只是...聪明而复杂。:) 但就大部分而言,正如你所暗示的那样,TCP不适合游戏中的实时通信。
  • 有办法使TCP更加适用,例如搜索“Nagle算法”。
  • 如果您已经在其上自行滚动了自己的无损传输协议,则可以通过UDP进行聊天。许多游戏都这样做。

关于Gamasutra中的网络文章已经有过报道,但我现在没有任何链接。不确定它们是否仍然公开可用,抱歉。


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