#ecs #component #entity #table #down #entities #finite

lluvia

一个简化版的实体组件系统,允许在有限的时间内进行无废话的数据存储

2 个版本

0.0.2 2023 年 11 月 12 日
0.0.1 2022 年 9 月 6 日

#10#finite

MIT 或 BSD-2-Clause

51KB
800

Lluvia - 一个简化版的实体组件系统,允许在有限的时间内进行无废话的数据存储。

这个库允许您快速将具有不同生命周期的对象集合到单个 ECS 中。您指定 Components,创建任意数量的引用计数的 Entity 对象,当 Entity 超出作用域时,其数据也将自动释放。您甚至可以将 Entity 对象作为其他实体的组件存储,当根 Entity 超出作用域时,所有数据将一次性释放。

这个 ECS 的特点是其速度非常快,范围非常小,占用空间非常小。实现大约有 500 行,没有依赖项,几乎所有操作都在 O(1) 时间内运行。没有原型设计,没有 rayon 集成,没有高级迭代器模式,也没有多线程访问。强调最小化复杂性和避免扫描或重新组织数据,因为 Lluvia 被设计为低延迟图形程序的数据引擎。

Lluvia 从创建一个 Instance 对象开始。这将跟踪系统中 Entity 对象的有效性,并持有用于存储的数据表引用。

然后可以使用 Instance 添加 Component 表,并使用 Session 对象访问它们。该 Session 允许获取和设置每个 Entity 的组件。

基本用法如下

use lluvia as ll;
// Create the ECS holder
let mut inst = ll::Instance::new();
// Make a new entity
let entity = inst.add_entity();

// Now add our component. This will be a string, but
// we don't have to specify that for now
let c = inst.add_component();

// Get a session to access data for component c. This
// allows access to the per-entity data for this component and
// lets us perform queries.
let mut sesh = inst.open_session(c).unwrap();

// Before querying the value, we first need to set a valid value
// for this component. Afterwards, we can get it and check that
// it is unchanged.
sesh.set(&entity, "Hola Lluvia");
let data_ref = sesh.get(&entity).unwrap();
assert_eq!(*data_ref, "Hola Lluvia");

无运行时依赖