1 个不稳定版本
使用旧的Rust 2015
0.1.0 | 2017年5月6日 |
---|
#740 在 科学
38KB
840 行
binpool
粒子物理分析实验性统一二进制格式
在运行粒子物理模拟时,有时记录数据并从模拟过程分离进行单独分析是很有用的。
此二进制格式旨在将粒子物理数据读入或写入文件或流,以便分析工具可以以最少的设置重新使用。
粒子物理数据类似于视频或动画流,区别在于时间定义是任意的。此格式通过更改偏移实例ID和范围,允许精确控制数据变化。
支持10种内置Rust数字类型,使用数组表示法,向量矩阵维度可达80x80。您还可以定义自定义二进制格式。
您可以多次重复相同的数据,或只写入更改的范围。语义由应用程序控制,但格式足够通用,可以在项目之间重用算法。
格式
type format == 0 => end of stream
type format: u16, property id: u16
|- bytes == 0 => no more data, next property
|- bytes: u64, offset instance id: u64, data: [u8; bytes]
整数以小端格式存储。
数据中的项目数量根据字节数和类型格式的知识推断得出。
设计动机
当文件格式以相同的方式组织时,它是一致的。
统一格式的优点之一是您可以轻松地将数据分割成多个文件,或者将其流式传输到网络上。它在运行物理模拟时也容易生成。
此文件格式假定应用程序具有某种形式的数据结构,其中每个粒子实例都分配一个唯一的ID,并且可以从属性ID推导出它们的对象关系。由于属性ID是已知的,因此可以使用外部工具分析相对物理属性,而无需了解数据结构。
要描述时间,只需创建一个新的属性ID,例如f32标量,并在同一时间步之前写出此值。
用法
为原始整数和浮点格式数组的数组类型实现了Scalar
、Vector
和Matrix
特性。
当您将数据写入文件时,顺序会被保留。
use binpool::Scalar;
let prop_id = 0; // A unique property id.
let data: Vec<f32> = vec![1.0, 2.0, 3.0];
Scalar::write_array(prop_id, &data, &mut file).unwrap();
当您从文件读取时,例如重放记录的模拟,通常一次读取一帧,然后等待读取下一帧的时间。为此,使用一个循环,并为每个属性设置标志,当所有读取标志都设置时退出循环。
use binpool::State;
let prop_id = 0; // A unique property id.
let mut read_prop_id = false;
let mut data: Vec<[f32; 2]> = vec![];
while let Ok((Some(state), ty, prop)) = State::read(&mut file) {
match prop {
prop_id if !read_prop_id => {
Vector::read_array(state, ty, &mut data, &mut file).unwrap();
read_prop_id = true;
}
_ => break,
}
}
数据通常存储在结构体中,并且每帧都会被覆盖。上面的示例使用局部变量只是为了展示如何读取数据。
许可证
根据以下任一许可证授权:
- Apache License,版本 2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT),任选其一。
贡献
除非您明确声明,否则您有意提交以包含在作品中的任何贡献都应按照上述方式双重许可,不附加任何额外的条款或条件。