gpt4 book ai didi

java - 服务器提供实时游戏状态更新

转载 作者:搜寻专家 更新时间:2023-11-01 02:53:52 25 4
gpt4 key购买 nike

目前我的游戏服务器很小(一个区域和大约 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) 只需构建状态更新数据包,直到我用完空间,然后忽略其余部分。非常糟糕的客户 View 。不是真正的选择。

2) 只将最近的 N 个实体的数据发送给客户端。这需要每个状态更新我为每个客户端计算最接近的 N。这可能非常耗时。

3) 一些如何设计数据包,以便我可以为同一个更新发送多个数据包。目前,客户端假定数据包采用以下结构:

int currentMessageIndex
int numberOfPCs
N * PC Entity data
int numberOfNPCs
N * NPS Entity data

然后客户端获取这个新数据并完全覆盖它的状态副本。由于数据包是完全自包含的,即使客户端错过了一个数据包,也没关系。我不确定我将如何为同一个更新实现多个数据包的想法,因为如果我错过了其中一个,那该怎么办?我无法用更新的部分状态覆盖完整的、过时的状态。

4) 只发送实际发生变化的变量。例如,对于每个实体,我添加一个 int,它是每个字段的位掩码。速度、目标、方向和 avatarImage 等内容不需要在每次更新时都发送。我仍然回到如果客户端错过了一个确实需要更新其中一个值的数据包会发生什么的问题。我不确定这有多重要。这还需要在客户端和服务器端进行更多计算以创建/读取数据包,但不会太多。

有什么更好的想法吗?

最佳答案

我会选择 4 号和 2 号。正如您所意识到的,通常只发送更新而不是完整的游戏状态会更好。但是请确保您始终发送绝对值而不是增量值,以便在丢弃数据包时不会丢失任何信息。您可以在客户端使用航位推算,使动画在糟糕的网络条件下尽可能流畅。您必须为此仔细设计,以便即使数据包丢失也不会很严重。

至于第 2 个,如果你为它设计,它就不必耗费时间。例如,您可以将您的游戏区域划分为一个正方形网格,其中每个实体始终恰好位于一个特定的正方形中,并让游戏世界对此进行跟踪。在这种情况下,计算周围 9 个网格中的实体是 O(1) 操作。

关于java - 服务器提供实时游戏状态更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com