我正在考虑创建一款网络游戏。
该游戏应该是一款 2D 平台射击游戏,使用 Libgdx 和 Box2D 创建。
对于网络,我规划了以下结构:
- 服务器和客户端是2个程序
- 服务器处理所有游戏内逻辑
- 客户端发送键/鼠标输入
- 服务器对这些使用react并更新整个级别
- 服务器发送这些更新(如果可能的话每秒 45 次,因此不需要客户端插值)
- 客户端获取更新并使用收到的更新来更新其本地关卡/世界
- 客户端在其
视锥体
中绘制事物
第一个问题:您对这个结构有何看法?
下一个问题:如果有几个玩家发射大量子弹(需要发送玩家和子弹位置),那么每秒 45 次可能会导致服务器端上传大量数据。
为了限制所需的上传,我考虑使用视锥体剔除
并仅发送客户端实际看到的数据/更新。
现在我已经看到了 KryoNet
方法 sendToAllTCP
并想知道,这种方法是否在某种程度上更高效,并且可以以某种方式仅上传一次数据,而不是每个客户端一次。
我在网络方面没有那么丰富的经验,而且我真的不认为可以为多个客户端进行 1 次上传。但为了确定我问。
那么,使用 sendToAllTCP
发送关卡的每个更新是否更有效,还是为每个客户端发送一次然后只发送他们可以看到的内容更有效?
最佳答案
KryoNet 是开源的,您可以在这里查看它在做什么:https://github.com/EsotericSoftware/kryonet
sendToAllTCP
方法在这里:
https://github.com/EsotericSoftware/kryonet/blob/master/src/com/esotericsoftware/kryonet/Server.java#L447
sendToAllTCP
方法只是循环 TCP 连接并向每个连接发送相同的数据。源代码中有一条评论说他们应该只序列化数据一次,然后多次发送序列化的对象,但它还没有这样做。
通常,一次发送数据到多个主机的能力称为“多播”。由于多种原因,它并不普遍可用,并且仅在高度特化的情况下有用。请参阅http://www.tcpipguide.com/free/t_IPMulticasting.htm
您将遇到的性能问题更有可能与互联网延迟有关,而不是与服务器发送数据包的原始能力有关。我还不太担心优化 TCP 连接发送。
关于java - KryoNet sendToAllTCP 与 sendTCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23566162/