#bevy-ecs #bevy #ecs #gamedev #game-engine

bevy_system_graph

为Bevy游戏引擎创建严格顺序的系统执行图的实用工具

5 个版本 (3 个重大更新)

0.4.0 2022年11月13日
0.3.0 2022年9月10日
0.2.0 2022年4月17日
0.1.1 2022年2月21日
0.1.0 2022年2月21日

#1497游戏开发

每月40 次下载

MIT/Apache

25KB
210

bevy_system_graph

crates.io Documentation License Discord

此crate提供了为Bevy游戏引擎创建严格顺序的系统执行图的实用工具。

支持的Bevy版本

Bevy版本 bevy_system_graph
0.9 0.4
0.8 0.3
0.7 0.2
0.6 0.1

启动图

要开始构建系统图,必须在图中添加一个或多个系统作为根节点。根系统在图中没有依赖项。

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中,SystemGraphSystemGraphNode都实现了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();

分支扩展到分支合并

用于实现forkjoin的类型是可组合的。

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支持,因此克隆它仍将指向相同的逻辑底层图。

依赖关系

~7–14MB
~174K SLoC