MMORPG 客户端/服务器通信中如何使用 UDP 和 TCP 协议?
例如:
客户端是否通过 UDP 向服务器广播(玩家位置等)?或相反亦然?
还是更像是在客户端请求服务器移动播放器时使用 TCP。服务器接收到请求,移动播放器并向客户端返回播放器现在位于 xyz 位置?
聊天频道必须使用 TCP 实现吗?
有没有这方面的好文章/书籍?我找到了零碎的东西,但似乎真正的肉和土豆是从经验中获得的。
许多游戏使用 UDP 进行与运动相关的活动——因此,例如,当你走路时,很可能会发送一堆 UDP 请求。服务器仍然最终控制这是否有效,但您不必关心每个数据包是否到达服务器。这就是为什么很多游戏客户端也使用某种预测机制的原因。
就您的第二次提及而言,是的,所有控件都由服务器管理是很常见的。您不希望客户端向服务器广播任何内容;您应该在服务器端进行错误和输入处理,以防止人们被黑客入侵。您还可以限制每秒输入。
无论如何,UDP 和 TCP 的组合是合适的——你只需要问自己,“我想要可靠性还是速度?”
有许多不同的可能实现,但在大多数情况下,它们看起来像这样。这种模式在游戏世界中几乎所有动作都会重复出现。
您不能依赖客户传递真实信息。有人会破解协议并作弊。加密数据不会阻止这一点——只是让它更难做。
客户端应该只发送移动请求等,服务器需要对请求进行健全性检查,以确保它们不违反游戏规则。服务器应该只发回客户端绝对需要的数据——你不能依赖客户端来获取大量的世界数据,而只是过滤掉玩家当前无法观察到的所有内容。有人会掌握额外的信息并加以利用。
如果游戏需要“实时”,那么客户端需要假设服务器将允许移动请求并相应地更新显示 - 如果服务器稍后更正它,则回滚移动。在大多数情况下,客户端和服务器会达成一致,一切都会顺利进行。当客户试图作弊时(无论如何这是他们的错),他们不会同意 - 或者客户由于连接不良而严重滞后(您对此无能为力)。
您的一半问题(使用的传输层协议)可以通过安装wireshark 并查看流量来回答。
您可能对Project Darkstar感兴趣。这是一个开源的 MMO 框架。
除了作为玩家的观察之外,我不知道任何细节,但大多数游戏绝对不会等待服务器回复来移动角色,除非它是基于回合制的,否则会扼杀用户体验。看起来发生的事情是移动在客户端完成并发送到服务器,然后服务器将这些消息发送给其他玩家。至少在《魔兽世界》中,如果玩家落后,您可能会看到他们仍在向前移动,然后稍后神奇地出现在另一个位置,这对我来说意味着客户端收到的不仅仅是位置数据,还有他们正在移动以及他们移动的方向然后在没有进一步数据的情况下推断运动。
你最好的选择可能是看看 Planeshift 的网络代码,它是一个开源的 MMO。我相信它是现场最发达的(最后我检查过)。
我认为这个问题没有一个简短的单一答案,它的范围相当广泛。尽管如此,还是有几点:
Gamasutra 有关于网络的文章,但我现在没有任何方便的链接。不确定它们是否仍然公开可用,抱歉。