2012-09-01 118 views
2

我想编一个游戏,其中很多玩家都在同一个级别。可以说这只是2D,最多有65,535名玩家。随着下面是在水平向客户端发送的信息关于一个球员数据:如何在多人游戏中处理很多玩家?

为65,535玩家
8 Bytes - Player ID 
8 Bytes - Player X Position 
8 Bytes - Player Y Position 
8 Bytes - Player Rotation 

32个字节将意味着2097120个字节(大约2 MB)在每一个级别的球员之一更新。如果这种情况发生在30fps,则需要60MB /秒。那么我怎么能在较低带宽使用的情况下在一个层次上处理那么多玩家呢?

感谢

+0

你真的需要一次更新*全部* 2^16个玩家吗?还是只需更新相关的子集? – mavam

+0

我只是在想最大的玩家是在一个层面上,每个人都在移动,这不应该导致滞后/崩溃 – thomasguenzel

+0

为什么不优化你的普通情况,或者这是你预期的情况有合理的概率? – mavam

回答

1

几件事情:

1)一般来说,不是每个玩家会看到在同一时间所有其他球员。你可以通过仅在一定距离内发送数据给玩家来进行优化(可能比他们看到的要宽一些,以平滑围绕视觉边缘的运动)

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

3)您只需发送已更改的信息,因此如果有更新,请不要更改。也许偶尔(每5秒钟或某事)发送一整套可见数据,无论是否发生变化,以解决丢失的数据包,但只有当您看到问题时才会这样做。

+0

谢谢!我想这应该可以完成这项工作 – thomasguenzel

1
  • 为65,535的球员,你需要2个字节的ID变量的。
  • 如果最小旋转角度为0.005度,则需要2个字节用于0-360度范围内的 。

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

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

甚至可以使用32位整数作为X,Y变量,点变体舍入到下一个整数值(这不是一个物理游戏不是吗?)。

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

您可以使用spatial indexing/octree将附近的玩家分组以达到对附近玩家的更快更新(其他玩家在不需要时更新(玩家的视线范围是什么?))。

+0

谢谢!但是UDP不可能接收到一些软件包?所以只发送更改可能会导致显示错误。 – thomasguenzel

+0

所以你想要一个完整的结构数据?当然数据可能随时丢失。概率是重要的,我认为 –

+0

有ogame,50000在线玩家在某个时间和更新速度很慢 –

1

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

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