0.1.1 |
|
---|
#53 在 #bevy-ecs
24KB
320 行
bevy_system_graph
此crate提供了为Bevy游戏引擎创建严格顺序的系统执行图的实用工具。
支持的Bevy版本
Bevy版本 | bevy_system_graph |
---|---|
0.1 | 0.6 |
开始构建图
要开始构建系统图,必须将一个或多个系统作为根节点添加到图中。根系统在图中没有依赖关系。
let graph = SystemGraph::new();
// Create a root system for the graph.
let root_a = graph.root(sys_a);
// Graphs can have multiple root nodes.
let root_b = graph.root(sys_b);
let root_c = graph.root(sys_c);
使用系统标签
系统仍然可以使用标签来建立系统相对于图外其他系统的顺序。
let graph = SystemGraph::new();
let root_a = graph.root(
sys_a
.label("Physics")
.before("Propagate Transforms")
);
转换为系统集
为了简化将图中的所有系统添加到Schedule
中,SystemGraph
和SystemGraphNode
都实现了Into<SystemSet>
。
let graph = SystemGraph::new();
let root_a = graph.root(sys_a);
// Convert into a SystemSet
let system_set: SystemSet = graph.into();
顺序执行
可以通过SystemGraphNode::then
按顺序连接图节点。这将从系统创建一个新的节点,并添加对原始系统的“之后”依赖关系。
let graph = SystemGraph::new();
graph
.root(sys_a)
.then(sys_b)
.then(sys_c);
// Convert into a SystemSet
let system_set: SystemSet = graph.into();
分散
可以使用SystemGraphNode::fork
分散到多个分支。所有分散的系统都不会执行,直到原始系统完成,但它们之间没有相互依赖关系。
let graph = SystemGraph::new();
// Fork out from one original node.
// sys_b, sys_c, and sys_d will only start when sys_a finishes.
let (c, b, d) = graph.root(sys_a)
.fork((
sys_b,
sys_c,
sys_d,
));
// Alternatively, calling "then" repeatedly achieves the same thing.
let e = d.then(sys_e);
let f = d.then(sys_f);
// Convert into a SystemSet
let system_set: SystemSet = graph.into();
集中
可以通过SystemJoin::join
等待多个系统运行之前。系统将不会运行,直到所有先前系统完成。
let graph = SystemGraph::new();
let start_a = graph.root(sys_a);
let start_b = graph.root(sys_b);
let start_c = graph.root(sys_c);
(start_a, start_b, start_c)
.join(sys_d)
.then(sys_e);
// Convert into a SystemSet
let system_set: SystemSet = graph.into();
分散到集中
用于实现fork
和join
的类型是可组合的。
let graph = SystemGraph::new();
graph.root(sys_a)
.fork((sys_b, sys_c, sys_d))
.join(sys_e)
.then(sys_f);
// Convert into a SystemSet
let system_set: SystemSet = graph.into();
克隆
单个[图节点]由Rc
支持,因此克隆它仍然指向相同的逻辑底层图。
依赖关系
~10MB
~180K SLoC