2

我想编写一个游戏,其中许多玩家处于同一级别。假设它只是 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/秒。那么我怎样才能以较低的带宽使用率在一个级别中处理这么多玩家呢?

谢谢

4

3 回答 3

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

所以,它是 20 字节(现在数据减少了 %37)。

如果玩家没有移动或旋转,那么就不需要发送 X、Y 或旋转数据,对吧?您可以将 1 字节的告密者添加为“无需更新 X”或“无需轮换”或“玩家离线”

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

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

您可以使用空间索引/八叉树对附近的玩家进行分组,以实现附近玩家的更快更新(其他人在不必要时不会更新(您的玩家视线范围是多少?))。

于 2012-09-01T17:22:06.430 回答
1

通常,大多数玩家看不到其他玩家。

仅向他们可以看到(或将接近能够看到)的玩家发送更新。

于 2012-09-01T17:31:10.353 回答
1

几件事:

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

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

3) You only need to send information that's changed, so if there were up updates, assume no change. Maybe occasionally (every 5 seconds or something) send the full set of visible data whether a change happened or not to account for lost packets, but only do that if you start seeing issues.

于 2012-09-01T17:43:58.563 回答