Networking 如何在多人游戏中处理多个玩家?

Networking 如何在多人游戏中处理多个玩家?,networking,network-programming,Networking,Network Programming,我想规划一个游戏,其中许多球员在同一水平。假设它只是2D,最多有65535名玩家。将以下数据发送到客户端,以获取关卡中一名玩家的信息: 8 Bytes - Player ID 8 Bytes - Player X Position 8 Bytes - Player Y Position 8 Bytes - Player Rotation 65535名玩家的32字节意味着该级别中每个玩家的一次更新需要2097120字节(约2MB)。如果以30fps的速度出现这种情况,则需要60MB/秒。那么,如

我想规划一个游戏,其中许多球员在同一水平。假设它只是2D,最多有65535名玩家。将以下数据发送到客户端,以获取关卡中一名玩家的信息:

8 Bytes - Player ID
8 Bytes - Player X Position
8 Bytes - Player Y Position
8 Bytes - Player Rotation
65535名玩家的32字节意味着该级别中每个玩家的一次更新需要2097120字节(约2MB)。如果以30fps的速度出现这种情况,则需要60MB/秒。那么,如何在一个级别上以较低的带宽使用率处理这么多的播放器呢

谢谢

  • 对于65535播放器,需要2字节的id变量
  • 如果最小旋转角度为0.005度,则需要2个字节来执行此操作 0-360度范围
因此,它是20个字节(现在减少了37个数据)

如果玩家没有移动或旋转,那么就不需要发送X、Y或旋转数据,对吗?您可以将1字节的信息添加为“无需更新X”或“无需轮换”或“播放器脱机”

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

设计游戏时,每个玩家都有一个其他玩家位置的缓存,当他们不移动时,就使用缓存


您可以使用将附近的玩家分组,以更快地更新附近的玩家(其他玩家在不必要时不会更新(您的玩家的视距是多少?)

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

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

以下几点:

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

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


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

你真的需要一次更新所有2^16玩家吗?或者更新一个相关的子集就足够了?我只是在想这样一种情况,最大的玩家都在一个级别,每个人都在移动,这不应该导致延迟/崩溃为什么不针对常见情况进行优化,或者这真的是一个你以合理的概率预期的场景吗?我希望这个游戏会变得足够受欢迎,从而吸引那么多玩家;)我建议阅读地震源代码。这里是对网络部分的回顾:谢谢!但是UDP不可能不接收某些包吗?所以只发送更改可能会导致错误显示。所以您想要完整的数据结构?当然,数据随时可能丢失。概率是很重要的,我想有一天会有50000名玩家在线,而且更新速度很慢