【问题标题】:KryoNet sendToAllTCP vs sendTCPKryoNet sendToAllTCP 与 sendTCP
【发布时间】:2014-05-09 13:41:47
【问题描述】:

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

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

第一个问题:您如何看待这种结构?
下一个问题:每秒45次可能是从服务器端上传大量数据,如果有几个玩家射出很多子弹(需要发送玩家和子弹位置)。
为了限制所需的上传,我考虑使用 view frustum culling 并仅发送客户端实际看到的数据/更新。
现在我看到了KryoNet 方法sendToAllTCP 并想知道,这种方法是否更有效,并且可以以某种方式只上传一次数据,而不是每个客户端一次。
我对网络没有那么丰富的经验,我真的不认为可以为一个以上的客户上传 1 个文件。但可以肯定的是我问。
那么使用sendToAllTCP 发送关卡的每次更新更有效,还是为每个客户发送一次然后只发送他们可以看到的内容更有效?

【问题讨论】:

    标签: java networking tcp libgdx kryonet


    【解决方案1】:

    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 连接发送。

    【讨论】:

    • 感谢您的信息。我认为关于为一个以上的客户上传一个上传的问题是一个愚蠢的问题,但似乎这确实存在^^ 知道它很有趣。对于延迟问题:我不认为我的游戏,即使我能够做到,也不会在线运行。我更多地考虑 Lan,延迟问题不存在那么多。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多