3个版本
0.2.4 | 2020年6月19日 |
---|---|
0.2.3 | 2020年6月18日 |
0.2.2 | 2020年6月13日 |
#1844 in 游戏开发
每月下载 132次
535KB
12K SLoC
Legion Systems
此crate为legion ECS库提供系统和调度器。
系统代表程序逻辑的单位,在World中创建、删除和操作实体。系统可以声明查询,以定义它们如何访问实体数据,并且可以声明对共享资源的访问。系统可以被编译成Schedule,并在每一帧执行。
定义系统
系统通过SystemBuilder构建。系统的函数体由闭包提供。
默认情况下,系统提供命令缓冲区和子世界。子世界允许访问实体数据,但实体不能立即创建或删除。相反,可以将实体创建命令排队到命令缓冲区中。默认情况下,在调度结束时刷新命令缓冲区。
let system = SystemBuilder::new("my system")
.build(|command_buffer, world, _, _| {
// create a new entity
command_buffer.insert(Tag, vec![(Pos, Vel)]);
});
可以向系统中添加查询以允许系统访问实体数据,并且可以通过资源访问共享数据
let system = SystemBuilder::new("my system")
.with_query(<(Read<Vel>, Write<Pos>)>::query())
.reads_resource::<Time>()
.build(|command_buffer, world, time, query| {
for (vel, pos) in query.iter_mut(world) {
*pos += *vel * time;
}
});
可以请求多个查询和资源。第三个和第四个闭包参数将包含所有资源和查询的元组。
系统可以编译成Schedule。并执行调度。调度将在可能的情况下自动并行化系统,基于每个系统声明的资源和实体访问。副作用(如写入组件)将按照系统被添加到调度的顺序可见。默认情况下,在调度结束时刷新系统命令缓冲区。
// create shared resources
let mut resources = Resources::default();
resources.insert(Time::new());
// define our system schedule
let mut schedule = Schedule::builder()
.add_system(update_positions)
.add_system(handle_collisions)
.flush() // flush command buffers so later systems can see new entities
.add_system(render)
.build();
// each frame, execute the schedule
schedule.execute(&mut world, &mut resources);
依赖项
~2.3–3.5MB
~65K SLoC