#tree #bevy #utility #gamedev #game

bevy_startup_tree

将启动系统依赖图插入应用的bevy扩展

11个版本 (5个破坏性更新)

0.6.1 2024年7月16日
0.5.2 2024年7月16日
0.4.1 2023年11月11日
0.1.3 2023年3月14日

#369 in 游戏开发

Download history 11/week @ 2024-07-06 529/week @ 2024-07-13 31/week @ 2024-07-20 15/week @ 2024-07-27

每月586次下载

MIT/Apache

18KB
238

bevy_startup_tree

Bevy兼容性

bevy bevy_startup_tree
~0.14 >=0.6
~0.13 >=0.5
~0.12 >=0.4
~0.11 >=0.3
~0.10 >=0.2
~0.9 ~0.1
<0.9 不支持

lib.rs:

将启动系统的依赖树插入Bevy App

使用startup_tree宏定义Bevy App的启动系统依赖树。使用AddStartupTree::add_startup_tree扩展方法将树插入到App中。强烈建议使用宏来生成由add_startup_tree消耗的数据结构。

这在启动逻辑复杂且需要分解为多个系统以受益的场景中很有用。其中一些启动逻辑可以并行运行;其他可能需要某些系统以特定顺序运行。例如,一个生成复杂bevy_ui的系统能够变得非常大、深度嵌套且难以维护。这样的系统可以被分解成多个协同工作以创建复杂实体层次结构的系统。必须运行在生成父实体的系统之后的生成子实体的系统;这就是bevy_startup_tree变得有用的地方。

Bevy兼容性

bevy bevy_startup_tree
~0.14 >=0.6
~0.13 >=0.5
~0.12 >=0.4
~0.11 >=0.3
~0.10 >=0.2
~0.9 ~0.1
<0.9 不支持

行为

组成启动树的系统或节点按深度分组。`startup_tree`宏生成一个二维数组,其中每个索引为`i`的行包含树中深度为`i`的节点。这个二维数组由`add_startup_tree`消耗,其中每个深度的子数组被组合成一个SystemSet

startup_tree! {
    sys_1_a,
    sys_1_b => sys_2
}

此宏调用将生成以下二维数组

 [ [sys_1_a, sys_1_b], [sys_2] ]
 

请注意,有两个子数组:一个用于深度为0的节点,一个用于深度1的节点。

每个子数组的集合在 Startup 调度 中按顺序运行。因此,上述树中插入到 Startup 调度的系统集合将是

  • 深度 0 树集合
  • 深度 0 树刷新集合
  • 深度 1 树集合
  • 深度 1 树刷新集合

示例

以下是一个具有启动树的 Bevy App 示例。请注意,应用程序将经过启动阶段,运行一个帧周期,然后退出。

use bevy::{log::LogPlugin, prelude::*};
use bevy_startup_tree::{startup_tree, AddStartupTree};

fn main() {
    App::new()
        .add_plugins((TaskPoolPlugin::default(), LogPlugin::default()))
        .add_systems(PreStartup, begin)
        .add_startup_tree(startup_tree! {
            sys_1_a,
            sys_1_b => sys_2_a,
            sys_1_c => {
                sys_2_b,
                sys_2_c => sys_3_a,
            },
        })
        .add_systems(PostStartup, end)
        .run();
}

fn begin() { info!("[Begin]"); }
fn sys_1_a() { info!("1.a"); }
fn sys_1_b() { info!("1.b"); }
fn sys_1_c() { info!("1.c"); }
fn sys_2_a() { info!("2.a"); }
fn sys_2_b() { info!("2.b"); }
fn sys_2_c() { info!("2.c"); }
fn sys_3_a() { info!("3.a"); }
fn end() { info!("[End]"); }

输出

 2023-01-08T19:38:41.664766Z  INFO example_app: [Begin]
 2023-01-08T19:38:41.664906Z  INFO example_app: 1.b
 2023-01-08T19:38:41.664937Z  INFO example_app: 1.c
 2023-01-08T19:38:41.664959Z  INFO example_app: 1.a
 2023-01-08T19:38:41.665104Z  INFO example_app: 2.c
 2023-01-08T19:38:41.665133Z  INFO example_app: 2.a
 2023-01-08T19:38:41.665141Z  INFO example_app: 2.b
 2023-01-08T19:38:41.665204Z  INFO example_app: 3.a
 2023-01-08T19:38:41.665264Z  INFO example_app: [End]
 

请注意,同一深度的所有日志(具有相同数字的日志)都分组在一起,因为这些系统属于同一集合。集合按顺序运行,导致数字排序。然而,集合内的系统则不按顺序,导致给定数字的字母是无序的。

beginend 系统演示了树在启动时运行的时间。要在树之前运行系统,将其插入到 PreStartup 调度 中。要在树之后运行系统,将其插入到 PostStartup 调度 中。

依赖

~12MB
~208K SLoC