Kryonet:最佳数据结构?

时间:2015-08-19 22:58:36

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

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

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

我对网络和内存效率有一点了解,但对这个库没有彻底了解,因此不确定标准方法是否有效。

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

我对内存管理并不熟悉,因为它与面向对象编程有关。由于这个'包'从技术上来说,这是一个例子,我猜这将使“内存安排”成为一个例子。更类似于' C结构'。另外,我不知道Kryonet如何处理数据,因此它非常理论化。

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

提前致谢。

1 个答案:

答案 0 :(得分: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的算法,它将等待短时间发送数据并将多个小数据包一起发送(这可以减少网络拥塞并可以禁用)。