networking - 如何在多人游戏关卡中处理众多玩家?

标签 networking network-programming

我想编写一个游戏,其中许多玩家处于同一级别。假设这只是 2D 游戏,最多有 65,535 名玩家。通过发送到客户端的以下数据来获取关卡中一名玩家的信息:

8 Bytes - Player ID
8 Bytes - Player X Position
8 Bytes - Player Y Position
8 Bytes - Player Rotation

对于 65,535 名玩家来说,32 字节意味着关卡中每个玩家的一次更新需要 2,097,120 字节(约 2 MB)。如果这种情况发生在 30fps 的情况下,则需要 60MB/秒。那么我怎样才能在一个关卡中以较低的带宽使用量处理这么多玩家呢?

谢谢

最佳答案

几件事:

1) 一般来说,并不是每个玩家都会同时看到其他所有玩家。您可以通过仅向一定距离内的玩家发送数据(可能比他们能看到的距离更宽一些,以平滑视觉边缘周围的移动)来优化这一点。

2) 仅仅因为您的游戏以 30fps 运行并不意味着它需要从服务器接收每秒 30 次更新。您可以发送不太频繁的更新并在其间插入帧。延迟是可变的,因此您需要做一些事情。

3) 您只需要发送已更改的信息,因此如果有更新,则假设没有更改。也许偶尔(每 5 秒或其他时间)发送完整的可见数据集,无论是否发生更改,以解释丢失的数据包,但仅在您开始看到问题时才这样做。

关于networking - 如何在多人游戏关卡中处理众多玩家?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229702/

相关文章:

networking - 找出哪个网络接口(interface)属于 docker 容器

linux - 使用 C 检测接口(interface)是否处于混杂模式

networking - 为什么 PathPing 比 Tracert 快?

java - 删除无响应的 channel - java

阻塞模式下的 Linux TCP 套接字

iOS/swift : Good architecture approach for connecting REST APIs

android - 如何判断经纬度是否准确

linux - 如何读取已重定向到本地主机的 tcp 数据包?

java - 如果端口对多播组无关紧要,为什么 DatagramSocket.joinGroup() 方法采用 SocketAddress?

c - 一直调用 malloc() 和 free() 有多糟糕?