2个不稳定版本
0.2.0 | 2020年1月5日 |
---|---|
0.1.0 | 2019年2月17日 |
#1632 in 数据结构
15KB
118 行
Soak
此软件包为结构体的字段分配并行、列式的数组。
许可证
根据以下任一许可证授权:
- Apache许可证,版本2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://www.apache.org/licenses/LICENSE-2.0)
由您选择。
贡献
除非您明确表示,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,以包括在作品中,应按上述方式双重许可,不附加任何额外条款或条件。
lib.rs
:
Soak
Soak是一个库,用于将数据从Array-of-Structs布局转换为Struct-of-Arrays布局。
在Rust中处理对象集合的自然方式是将它们表示为结构体,通常放置在[Vec
]中。这会将每个对象的字段一起在内存中布局
[field 1, field 2][field 1, field 2][field 1, field 2]...
通常,交错对象的字段可以提高性能,使单个字段分组在一起
[field 1, field 1, field 1][field 2, field 2, field 2]...
Soak提供的主要工具是Columns
特质,它记录结构体的布局;以及RawTable
类型,即数组的同义词结构。它们可以像这样一起使用
use core::ptr;
use dioptre::Fields;
use soak::{RawTable, Columns};
#[derive(Fields, Columns)]
struct GameObject {
position: (f32, f32),
velocity: (f32, f32),
health: f32,
}
unsafe fn process(table: &mut RawTable<GameObject>) {
let positions = table.ptr(GameObject::position);
let velocities = table.ptr(GameObject::velocity);
let healths = table.ptr(GameObject::health);
for i in 0..table.capacity() {
let position = &mut *positions.add(i);
let velocity = &mut *velocities.add(i);
position.0 += velocity.0;
position.1 += velocity.1;
}
}
依赖项
~1.5MB
~36K SLoC