提供实时游戏状态更新的服务器
|
目前,我的游戏服务器很小(一个区域,约有50个AI),每次发送状态更新数据包(UDP)时,它都会向每个客户端发送完整状态。这将创建约1100字节的数据包大小。它发送的几乎所有实体的以下信息:
int uid
int avatarImage
float xPos
float yPos
int direction
int attackState
24 bytes
编辑:更有效的结构
int uid
byte avatarImage
float xPos
float yPos
byte direction & attackState
14 bytes
但我最终需要向实体发送更多信息。例如,我要添加到此:
float targetXPos
float targetYPos
float speed
由于需要为每个实体发送更多数据,因此我正在快速接近并且很可能已经通过了数据包的最大大小。因此,我试图考虑一些解决问题的方法:
1)只需建立状态更新数据包,直到我用完房间,然后将其余的都省去即可。客户端视图非常糟糕。并非真正的选择。
2)仅将N个最近实体的数据发送给客户端。这就要求每个状态更新我都为每个客户端计算最接近的N。这可能非常耗时。
3)一些如何设计数据包,以便我可以为同一更新发送多个数据包。当前,客户端假定数据包具有以下结构:
int currentMessageIndex
int numberOfPCs
N * PC Entity data
int numberOfNPCs
N * NPS Entity data
然后,客户端将获取此新数据,并完全覆盖其状态副本。由于数据包是完全独立的,即使客户端错过了数据包,也可以。我不确定如何将多个数据包用于同一更新,因为如果我错过了其中一个,那又会怎样呢?我无法用更新的部分状态覆盖完整的过时状态。
4)仅发送更改的实际变量。例如,对于每个实体,我添加一个int,它是每个字段的位掩码。不需要每次更新都发送诸如速度,目标,方向和avatarImage之类的信息。我仍然回到有关客户端丢失实际上确实需要更新这些值之一的数据包的情况的问题。我不确定这有多重要。这也需要在客户端和服务器端进行一些更多的计算来创建/读取数据包,但不要太多。
还有更好的主意吗?
没有找到相关结果
已邀请:
3 个回复
田损比报
磐剩
死狸蔽垂藐