如何在多人游戏级别处理多个玩家?

时间:2012-09-01 17:04:09

标签: 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 /秒。那么如何在一个级别上处理那么多玩家使用较低的带宽呢?

由于

3 个答案:

答案 0 :(得分:1)

  • 对于65,535名玩家,您需要2个字节的id-variable。
  • 如果最小旋转角度为0.005度,则需要2个字节 0-360度范围。

因此,它是20个字节(现在减少37%的数据)。

如果玩家没有移动或旋转,那么就没有必要发送X,Y或旋转数据吗?您可以添加1字节的线人作为“无需更新X”或“无需旋转”或“播放器离线”

你甚至可以对X,Y变量使用32位整数,只有当浮点变量舍入到下一个整数值时才更新(这不是物理游戏不是吗?)。

设计游戏的方式是每个玩家都有其他玩家位置的缓存,当他们不移动时,只需使用缓存。

您可以使用spatial indexing/octree对附近玩家进行分组,以便为​​近距离玩家实现更快速的更新(其他人在不必要的情况下不会更新(您的玩家视线范围是多少?)。)

答案 1 :(得分:1)

通常情况下,大多数玩家都看不到其他玩家。

只为他们可以看到的玩家发送更新给玩家(或者接近能够看到的玩家)。

答案 2 :(得分:1)

有几件事:

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

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

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