0

所以,我一直在研究在线游戏,我想知道他们是如何设法与服务器建立如此快速、看似持续的连接的。我已经尝试过只发送一堆XMLHttpRequests,但这些往往很慢。我也尝试过研究,但大多数关于该主题的文章都谈论 web sockets、tcp 和 udp 之类的东西,我根本不理解这些概念。我也在尝试在不从外部源导入代码的情况下完成这一切,这样我可以更好地理解它是如何工作的。如果可以的话请帮忙。谢谢!

4

1 回答 1

0

到目前为止,您的问题对于这个平台来说太宽泛了。

我会尽可能简短地回答。

阿贾克斯 /XMLHttpRequest

XMLHttpRequest每次发送数据时,API 都会(通常)打开一个到主机的新连接。这是一项非常昂贵的操作,并且会损害性能。

要考虑的另一点是,anXMLHttpRequest始终发送身份验证和其他标头,从而在客户端和服务器上浪费带宽和 CPU 周期。

还有一个问题是这种方法通常基于轮询,因此即使没有更改或更新,数据也会被发送和处理。这不仅是一种浪费,而且可能会伤害正在等待更新的其他客户端。

最后,AJAX /XMLHttpRequest将使用 TCP/IP 连接,如果您必须确保所有数据按顺序到达但会导致性能下降,这非常好。

网络套接字

WebSockets 是一种在流连接上运行的协议,例如 TCP/IP 连接(或管道或 unix 套接字)。

一旦建立连接,它就是持久的,它允许双向通信。这允许客户端和服务器在没有轮询和额外成本(标头、重新身份验证等)的情况下启动更新。

WebSockets 仍然位于流式套接字上,例如 TCP/IP 套接字,它会产生性能 const 以换取数据完整性(所有数据按顺序到达)。

TCP/IP 套接字

TCP/IP 是一种流协议,而不是基于消息的协议。出于这个原因,它经常与其他协议(例如 WebSockets 或自定义编写的协议)一起使用。

由于 WebSockets 将在 99.9% 的时间使用 TCP/IP(除非在同一台机器上或在定制的特殊场合),我为 WebSockets 描述的相同问题在这里适用。

但是,通过使用带有 TCP/IP 的自定义协议,可以实现一些性能优化(以与网络连接和中间干扰相关的代价)。

UDP(数据报)

许多游戏不需要数据完整性。丢包没关系,更重要的是最新的信息尽快到达。

这就是 UDP 套接字的用武之地。没有高成本的连接协商阶段(就往返而言,UDP 实际上是免费的),也没有可能阻止乱序到达的数据的数据完整性测试层。

由于这些原因,一些游戏需要 UDP 套接字来进行快速更新,同时仍然使用 TCP/IP 连接来获取必须安全到达的数据。

于 2019-01-13T08:53:47.827 回答