服务器如何避免 MMO 游戏中流量的二次增长?
How do servers avoid a quadratic increase in traffic in MMO games?
假设您有一个服务器权威的多人在线游戏(服务器对游戏中发生的事情有最终决定权,客户端只渲染图形并接受用户输入并将其提供给服务器)。
如果你有 X
个玩家在一个区域中彼此相邻,在彼此可见的情况下,服务器必须向每个玩家发送有关所有玩家状态的信息。
位置、当前动画、游戏数据等
这意味着它必须发送 X^2
的数据。然而,我见过超过 1000 名玩家聚集在一个地方的游戏,但它仍能正常运行。
如果服务器试图发送如此荒谬的数据量,这是不可能的。
那么它是如何完成的?
更新其他玩家的状态不需要很多数据。例如,每个客户端都可以重新计算所有其他玩家的位置、动画状态、统计数据等,只需给定他们的游戏手柄输入。假设有 16 个按钮(位),每秒采样 10 次。这导致每个玩家每秒 20 字节的数据,需要 20 * 1000 * 1000 bytes/s = 1,000 个玩家的总带宽的 20 MB/s 的总带宽。该数据通常可以通过仅传输 (action, timestamp) 对来进一步压缩。
也就是说,在 MMO 游戏的许多方面,根本无法避免二次 space 或时间复杂度。这就是为什么即使是今天的 MMO 通常也只支持每张地图 32-64 名玩家,很少支持 256 名或更多玩家。
假设您有一个服务器权威的多人在线游戏(服务器对游戏中发生的事情有最终决定权,客户端只渲染图形并接受用户输入并将其提供给服务器)。
如果你有 X
个玩家在一个区域中彼此相邻,在彼此可见的情况下,服务器必须向每个玩家发送有关所有玩家状态的信息。
位置、当前动画、游戏数据等
这意味着它必须发送 X^2
的数据。然而,我见过超过 1000 名玩家聚集在一个地方的游戏,但它仍能正常运行。
如果服务器试图发送如此荒谬的数据量,这是不可能的。
那么它是如何完成的?
更新其他玩家的状态不需要很多数据。例如,每个客户端都可以重新计算所有其他玩家的位置、动画状态、统计数据等,只需给定他们的游戏手柄输入。假设有 16 个按钮(位),每秒采样 10 次。这导致每个玩家每秒 20 字节的数据,需要 20 * 1000 * 1000 bytes/s = 1,000 个玩家的总带宽的 20 MB/s 的总带宽。该数据通常可以通过仅传输 (action, timestamp) 对来进一步压缩。
也就是说,在 MMO 游戏的许多方面,根本无法避免二次 space 或时间复杂度。这就是为什么即使是今天的 MMO 通常也只支持每张地图 32-64 名玩家,很少支持 256 名或更多玩家。