0

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

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

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

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

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

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

提前致谢。

4

1 回答 1

1

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

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

{
  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 算法,它会在短时间内等待发送数据并一起发送多个小数据包(这可以减少网络拥塞并且可以禁用)。

于 2015-08-22T23:59:07.497 回答