java – 提供实时游戏状态更新的服务器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 提供实时游戏状态更新的服务器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1919字,纯文字阅读大概需要3分钟。
内容图文
![java – 提供实时游戏状态更新的服务器](/upload/InfoBanner/zyjiaocheng/791/cc7155d8b9f74593b8d78d3af86b1531.jpg)
目前我的游戏服务器很小(一个区域和~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等内容.我仍然回到如果客户端错过了确实需要更新其中一个值的数据包会发生什么的问题.我不确定这会有多重要.这也需要在客户端和服务器端进行更多的计算以创建/读取数据包,但不能太多.
还有更好的想法吗?
解决方法:
我会选择4号和2号.
如您所知,通常最好只发送更新而不是完整的游戏状态.但请确保始终发送绝对值而不是增量,以便在丢弃数据包时不会丢失任何信息.您可以在客户端使用航位推算,以便在糟糕的网络条件下尽可能平滑地制作动画.
您必须仔细设计,以便在数据包丢失时并不重要.
对于数字2,如果你设计它,它不一定非常耗时.例如,您可以将游戏区域划分为正方形网格,其中每个实体始终位于一个特定的正方形中,让游戏世界对此进行跟踪.在这种情况下,计算9个周期网格中的实体是O(1)操作.
内容总结
以上是互联网集市为您收集整理的java – 提供实时游戏状态更新的服务器全部内容,希望文章能够帮你解决java – 提供实时游戏状态更新的服务器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。