3个版本

0.2.4 2020年6月19日
0.2.3 2020年6月18日
0.2.2 2020年6月13日

#1844 in 游戏开发

Download history 151/week @ 2024-04-01 35/week @ 2024-04-08 38/week @ 2024-04-15 44/week @ 2024-04-22 46/week @ 2024-04-29 40/week @ 2024-05-06 41/week @ 2024-05-13 40/week @ 2024-05-20 34/week @ 2024-05-27 35/week @ 2024-06-03 34/week @ 2024-06-10 40/week @ 2024-06-17 53/week @ 2024-06-24 23/week @ 2024-07-08 54/week @ 2024-07-15

每月下载 132次

MIT 协议

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