#nbt #minecraft #java #tags #versatile #edition #compound

ussr-nbt

为 Minecraft: Java Edition 提供一个非常快速和通用的 NBT 库

5 个版本

0.2.1 2024 年 8 月 12 日
0.2.0 2024 年 8 月 11 日
0.1.2 2024 年 8 月 10 日
0.1.1 2024 年 8 月 10 日
0.1.0 2024 年 8 月 10 日

#74游戏

Download history 160/week @ 2024-08-05 121/week @ 2024-08-12

每月 281 次下载

MIT 许可证

180KB
2K SLoC

ussr-nbt

为 Minecraft: Java Edition 提供一个非常快速和通用的 NBT 库。

此库的一些特性

  • 一个用于避免大多数分配和所有复制的 borrow 模块。
  • 一个区分完整 (Nbt) 和部分 (CompoundTagList) NBT 值的 API。
  • 支持 Minecraft 1.12 中引入的 TAG_Long_Array
  • 支持 Java 使用的修改后的 UTF-8 编码字符串。

使用

use std::net::TcpStream;

use ussr_nbt::owned::*;

fn main() {
    let mut conn: TcpStream = TcpStream::connect("127.0.0.1:25565").unwrap();
    let nbt: Nbt = Nbt::read(&mut conn).unwrap();
    println!("{nbt:#?}");
}

有关更多示例,请参阅 examples 目录。

说明

  • 在解析过程中不执行修改后的 UTF-8 验证和转换。
  • 在解析过程中不交换字节序。
  • 字节是无符号的。
  • 在序列化时,此库将只为列表/数组写入最多 i32::MAX 个元素,并为字符串写入最多 u16::MAX 个字节。这是由于 NBT 规范使用 [i32] 作为列表/数组的长度,使用 [u16] 作为字符串的长度。

路线图

  • nbt! 宏用于构建 NBT 值。
  • serde 支持。
  • 一些用于检查(和绑定)NBT 模式的宏。
  • Debug>/Display 中的 SNBT 格式化。
  • 也许为 RawVecRawSlice 提供迭代器,尽管批量转换更有效。

性能比较

反序列化

  1. simdnbt::borrow
  2. ussr-nbt::borrow
  3. simdnbt::owned
  4. ussr-nbt::owned
  5. shen-nbt5
  6. azalea-nbt
  7. graphite_binary

Serialization benchmarks violin plot

序列化

  1. simdnbt::owned
  2. azalea-nbt
  3. ussr-nbt::borrow
  4. ussr-nbt::owned*
  5. simdnbt::borrow*
  6. graphite_binary
  7. shen-nbt5

*注意:数字 4 和 5 非常接近。

Deserialization benchmarks violin plot

图表使用 criterion 生成。

Cargo 功能

为此库在批量交换字节序时使用 SIMD 指令。默认情况下,它将检测 CPU 功能并使用最快的可用指令集。但是,如果您禁用了 rt-cpu-feat 功能,它将始终使用后备实现,实际上如果使用 -C target-cpu=native 编译,这是一个性能最佳的实现。请注意,此标志将使得生成的二进制文件只能在编译它的 CPU 上运行。

依赖项

~1.1–1.7MB
~28K SLoC