KryoNet sendToAllTCP vs sendTCP

时间:2014-05-09 13:41:47

标签: java networking tcp libgdx kryonet

我正在考虑创建一个网络游戏 该游戏应该是一个2D平台射击游戏,由Libgdx和Box2D创建 对于网络,我计划了以下结构:

  • 服务器和客户端是2个程序
  • 服务器处理所有游戏逻辑
  • 客户端发送键/鼠标输入
  • 服务器对这些做出反应并更新整个级别
  • 服务器发送这些更新(如果可能,每秒45次,因此不需要客户端插值)
  • 客户使用收到的更新获取更新并更新其本地级别/世界
  • 客户端在其view frustum
  • 中绘制内容

第一个问题:您如何看待这种结构? 下一个问题:每秒45次可以从服务器端上传很多数据,如果有少数玩家投射了很多子弹(玩家和子弹位置需要发送)。
为了限制所需的上传,我考虑使用view frustum culling并仅发送客户端实际看到的数据/更新 现在我已经看到了KryoNet方法sendToAllTCP并且想知道,如果这种方法在某种程度上更有效并且可以某种方式仅上传数据一次,而不是每个客户端上传一次。
我不是那种有网络经验的人,我真的不认为可以为一个客户端上传一次。但我确定要问 因此,使用sendToAllTCP发送级别的每个更新是否更有效,或者为每个客户端发送一次更有效,然后只发送他们可以看到的内容?

1 个答案:

答案 0 :(得分:1)

KryoNet是开源的,你可以看到它在这里做了什么:https://github.com/EsotericSoftware/kryonet

sendToAllTCP方法在这里: https://github.com/EsotericSoftware/kryonet/blob/master/src/com/esotericsoftware/kryonet/Server.java#L447

sendToAllTCP方法只是遍历TCP连接,并向每个连接发送相同的数据。源代码中有一条注释,它们应该只序列化一次数据,并多次发送序列化对象,但它还没有这样做。

通常,在单个发送上向多个主机发送数据的能力称为" multicast"。由于许多原因,它通常不可用,仅在高度专业化的情况下有用。见http://www.tcpipguide.com/free/t_IPMulticasting.htm

您遇到的性能问题更可能发生在互联网延迟上,而不是服务器发送数据包的原始能力上。我还不太担心优化TCP连接发送。