2个不稳定版本

0.2.0 2020年1月5日
0.1.0 2019年2月17日

#1632 in 数据结构

MIT/Apache

15KB
118

Soak

License Cargo Documentation

此软件包为结构体的字段分配并行、列式的数组。

许可证

根据以下任一许可证授权:

由您选择。

贡献

除非您明确表示,否则根据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