【问题标题】:How to handle many players in a multiplayer level?如何在多人游戏关卡中处理多个玩家?
【发布时间】:2012-09-01 17:04:08
【问题描述】:

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

谢谢

【问题讨论】:

  • 你真的需要一次更新所有 2^16个玩家吗?还是更新相关子集就足够了?
  • 我只是在考虑最多玩家处于一个级别并且每个人都在移动的情况,这不应该导致滞后/崩溃
  • 为什么不针对常见情况进行优化,或者这确实是您以合理概率预期的场景?
  • 我希望这款游戏能够流行到足以吸引那么多玩家;)
  • 我推荐阅读地震源代码。这是网络部分的评论:fabiensanglard.net/quakeSource/quakeSourceNetWork.php

标签: networking network-programming


【解决方案1】:

几件事:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      • 对于 65,535 名玩家,您需要 2 个字节的 id 变量。
      • 如果最小旋转角度为 0.005 度,则需要 2 个字节 0-360 度范围。

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

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

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

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

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

      【讨论】:

      • 谢谢!但是使用 UDP 是否有可能不接收某些包?所以只发送更改可能会导致错误显示。
      • 所以你想要一个完整的结构数据?当然,数据随时可能丢失。我认为概率很重要
      • 有一个 ogame 有时在线人数不到 50000 并且更新速度很慢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2019-03-16
      • 2018-04-22
      相关资源
      最近更新 更多