【问题标题】:Kryonet: Best Data Structure?Kryonet:最好的数据结构?
【发布时间】:2015-08-19 22:58:36
【问题描述】:

我正在用 Java 编写一个图形化的在线程序,并使用 Kryonet 库来处理网络。

我相信这个库要求数据包是类的实例。我不确定这一点,但是没有找到任何其他建议。

我对网络和内存效率略知一二,但对这个库不是很了解,因此不确定标准方法是否有效。

我对高效数据结构的最佳猜测是将我的 Vec2 对象分解为分别代表 X 和 Y 属性的浮点数。从逻辑上讲,将这些值存储在单个浮点数组中然后作为数据包传输应该是有效的。

我不太熟悉内存管理,因为它与面向对象编程有关。由于这个“数据包”在技术上是一个实例,我猜这会使“内存安排”更类似于“C 结构”。另外,我不知道 Kryonet 是如何处理数据的,所以这都是非常理论化的。

我的问题是:将所有数据塞入单个浮点数组是否比将所有属性安排为类的单个成员更有效?或者也许是一组数组而不是一个?

提前致谢。

【问题讨论】:

  • 我无法与Kryonet 通话。一般来说,数组是可变宽度的,而字段集合具有已知的字段计数。因此,当对数组进行编码时,它通常具有长度前缀(如 Pascal 字符串)或标记值(如 C 样式字符串)。根据 Kryonet 的操作方式,它可能会使用比浮点数组更少的字节来编码浮点字段的集合。此外,根据数据包的重构方式,您将拥有一个具有命名、可理解字段的对象,而不是可变大小数组中的一堆未标记元素。
  • 有趣,虽然关于 C,我认为数组(和算术)比变量更有效。我同意 oop 字段有时更易于访问,具有名称。我想我最关心的是网络速度。您对此了解更多或可能有任何链接?

标签: java networking memory-management data-structures kryonet


【解决方案1】:

没有理由将您的字段拆分成一个数组:数组不会在空间或时间效率方面为您提供任何帮助。最大的例外是基于文本的表示,例如 JSON,它必须包括“字段”的名称及其值。我特别指的是所有各方都知道相关数据结构的二进制表示。根据我对 Kryonet 的快速浏览,它看起来实际上是a binary one

例如,想象一个具有类似于以下架构的对象:

{
  x: 5.483,
  y: 0.7245
}

此对象有两个浮点字段。二进制表示可能正好是 8 个字节长 - 每个浮点数 4 个字节。这假设所有各方都知道一个数据包由两个浮点数组成。或者,您可以使用类型注释二进制表示。这些第一个版本可能类似于:

0000000 af40 bc74 393f d578
0000008

另一方面,文本表示可能类似于 JSON:

{"x":5.483,"y":0.7245}

此表示具有可变大小,具体取决于所讨论的浮点数的确切值(与大小无关)。将此与将其编码为 JSON 中的数组进行比较:

[5.483,0.7245]

这总是比对象变体小,但不一定比二进制表示短。此外,与二进制表示相反,文本表示具有可变大小,需要包含(长度前缀)或标记(例如,使用空字符)。

至于网络速度,这完全取决于您在做什么以及如何定义速度。您可以说速度是您可以以字节/秒为单位传输大量数据的速率。您也可以说速度是一个数据包到达其目的地所需的时间。另一个衡量标准是往返时间 (RTT),通常(但不总是)大约是两个程序之间单次往返时间的两倍。

如果您试图最大限度地提高数据/时间的速率,您会希望数据占用更少的空间 - 以更小的数据表示。如果你试图最小化点之间的时间,同样的事情也会发生,但有一个重要的警告:TCP 等网络协议通常会实现 Nagle 算法,它会在短时间内等待发送数据并一起发送多个小数据包(这可以减少网络拥塞并且可以禁用)。

【讨论】:

  • 我还把我的 Vec2 对象变成了浮点数。物体会更小吗?
  • 我不确定我是否理解问题
  • Vec2 是一个用于处理向量 X/Y 坐标的 Java 类。就像我将“字段”整合到一个浮点数组中一样,我将 X 和 Y 字段与 Vec2 对象分开并将它们作为浮点数发送,认为它们会小于 Vec2 对象。
  • 没有。看我的回答。如果双方都了解消息的结构/格式,那么唯一需要传输的数据就是内容。在这两种情况下,内容只是两个浮点数。
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2016-05-18
相关资源
最近更新 更多