java - KryoNet sendToAllTCP 与 sendTCP

标签 java networking tcp libgdx kryonet

我正在考虑创建一款网络游戏。
该游戏应该是一款 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/

相关文章:

java - 为什么打印 [[Ljava.lang.Object;@12f29d9, [Ljava.lang.Object;@1648f32]

networking - Net.exe在使用/savecred时使用 'Error: A command was used with conflicting switches.'

javascript - 在node.js中使用tcp发送大文件但收到损坏的文件

java - 如何将 Power BI 嵌入到基于 Spring 的项目中?

java - 如何通过jdbc模板映射类

java - 乐观锁批量更新

python - 如何知道 urllib.urlretrieve 是否成功?

java - 基于连接的通信和基于数据报的通信

sockets - TCP sockets 和 web sockets 的区别,再来一次

java - 如果服务器没有客户端 TCP 使用 java 请求的文件,如何显示错误消息