gpt4 book ai didi

java - Kryonet:最好的数据结构?

转载 作者:行者123 更新时间:2023-12-01 11:13:36 25 4
gpt4 key购买 nike

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

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

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

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

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

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

提前致谢。

最佳答案

没有理由将字段打乱到数组中:数组在空间或时间效率方面不会为您提供任何帮助。最大的异常(exception)是基于文本的表示形式,例如 JSON,它必须包含“字段”的名称及其值。我特别指的是二进制表示形式,其中相关数据的结构为各方所知。根据我对 Kryonet 的快速浏览,看起来该表示实际上是 a binary one .

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

{
x: 5.483,
y: 0.7245
}

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

0000000 af40 bc74 393f d578
0000008

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

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

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

[5.483,0.7245]

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

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

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

关于java - Kryonet:最好的数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32106972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com