Kryonet:最佳数据结构?
Kryonet: Best Data Structure?
我正在 Java 中编写一个图形化的在线程序,并使用 Kryonet 库来处理网络。
我相信这个库要求数据包是 classes 的实例。我不确定这一点,但是没有找到任何其他建议的文档。
我对网络和内存效率略有了解,但对这个库的了解并不透彻,因此不确定标准方法是否有效。
我对高效数据结构的最佳猜测是将我的 Vec2 对象分解为分别表示 X 和 Y 属性的浮点数。从逻辑上讲,将这些值存储在单个浮点数组中然后将其作为数据包传输应该是有效的。
我不太熟悉内存管理,因为它属于面向对象编程。由于这个 'packet' 在技术上是一个实例,我猜这会使 'memory arrangement' 更类似于 'C structure'。此外,我不知道 Kryonet 是如何处理数据的,所以这一切都是非常理论化的。
我的问题是:将所有数据塞入单个浮点数组是否比将所有属性安排为 class 的单个成员更有效?或者也许是一组数组而不是一个数组?
提前致谢。
没有理由将您的字段拼凑成一个数组:数组在 space 或时间效率方面不会借给您任何东西。最大的例外是基于文本的表示,例如 JSON,它必须包含 "fields" 的名称及其值。我特别指的是所有各方都知道所讨论数据的结构的二进制表示。根据我对 Kryonet 的快速浏览,看起来表示实际上是 a binary one.
举个例子,假设一个对象的模式类似于:
{
x: 5.483,
y: 0.7245
}
这个对象有两个浮点字段。二进制表示可能正好是 8 个字节长——每个浮点数四个字节。这假设所有各方都知道一个数据包由两个浮点数组成。或者,您可以使用类型注释二进制表示。这些第一个版本可能类似于:
0000000 af40 bc74 393f d578
0000008
另一方面,文本表示可能类似于 JSON:
{"x":5.483,"y":0.7245}
此表示具有可变大小,具体取决于所讨论浮点数的确切值(与大小无关)。将此与在 JSON:
中将其编码为数组进行比较
[5.483,0.7245]
这总是比对象变体小,但不一定比二进制表示短。此外,与二进制表示相反,文本表示具有可变大小,需要包含(长度前缀)或标记(例如,使用空字符)。
至于网络速度,这完全取决于您在做什么以及您如何定义速度。您可以说速度是您传输大量数据的速率 bytes/second。您也可以说速度是一个数据包到达目的地所需的时间。另一个指标是往返时间 (RTT),它通常(但不总是)大约是所讨论的两个程序之间任一方向的单次行程的两倍。
如果您试图最大化 data/time 的速率,您希望数据占用更少 space - 以更小的数据表示形式。如果你试图最小化点之间的时间,同样的事情也会发生,但有一个重要的警告:TCP 等网络协议通常实现 Nagle 算法,它会等待发送数据一小段时间并一起发送多个小数据包(这可以减少网络拥塞,可以禁用)。
我正在 Java 中编写一个图形化的在线程序,并使用 Kryonet 库来处理网络。
我相信这个库要求数据包是 classes 的实例。我不确定这一点,但是没有找到任何其他建议的文档。
我对网络和内存效率略有了解,但对这个库的了解并不透彻,因此不确定标准方法是否有效。
我对高效数据结构的最佳猜测是将我的 Vec2 对象分解为分别表示 X 和 Y 属性的浮点数。从逻辑上讲,将这些值存储在单个浮点数组中然后将其作为数据包传输应该是有效的。
我不太熟悉内存管理,因为它属于面向对象编程。由于这个 'packet' 在技术上是一个实例,我猜这会使 'memory arrangement' 更类似于 'C structure'。此外,我不知道 Kryonet 是如何处理数据的,所以这一切都是非常理论化的。
我的问题是:将所有数据塞入单个浮点数组是否比将所有属性安排为 class 的单个成员更有效?或者也许是一组数组而不是一个数组?
提前致谢。
没有理由将您的字段拼凑成一个数组:数组在 space 或时间效率方面不会借给您任何东西。最大的例外是基于文本的表示,例如 JSON,它必须包含 "fields" 的名称及其值。我特别指的是所有各方都知道所讨论数据的结构的二进制表示。根据我对 Kryonet 的快速浏览,看起来表示实际上是 a binary one.
举个例子,假设一个对象的模式类似于:
{
x: 5.483,
y: 0.7245
}
这个对象有两个浮点字段。二进制表示可能正好是 8 个字节长——每个浮点数四个字节。这假设所有各方都知道一个数据包由两个浮点数组成。或者,您可以使用类型注释二进制表示。这些第一个版本可能类似于:
0000000 af40 bc74 393f d578
0000008
另一方面,文本表示可能类似于 JSON:
{"x":5.483,"y":0.7245}
此表示具有可变大小,具体取决于所讨论浮点数的确切值(与大小无关)。将此与在 JSON:
中将其编码为数组进行比较[5.483,0.7245]
这总是比对象变体小,但不一定比二进制表示短。此外,与二进制表示相反,文本表示具有可变大小,需要包含(长度前缀)或标记(例如,使用空字符)。
至于网络速度,这完全取决于您在做什么以及您如何定义速度。您可以说速度是您传输大量数据的速率 bytes/second。您也可以说速度是一个数据包到达目的地所需的时间。另一个指标是往返时间 (RTT),它通常(但不总是)大约是所讨论的两个程序之间任一方向的单次行程的两倍。
如果您试图最大化 data/time 的速率,您希望数据占用更少 space - 以更小的数据表示形式。如果你试图最小化点之间的时间,同样的事情也会发生,但有一个重要的警告:TCP 等网络协议通常实现 Nagle 算法,它会等待发送数据一小段时间并一起发送多个小数据包(这可以减少网络拥塞,可以禁用)。