Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

附录 C:内置 Schedule / SystemSet 一览

本附录列出 Bevy 内置的所有 Schedule 标签和主要 SystemSet。

主循环 Schedule

主循环每帧按以下顺序执行 Schedule。默认 feature 集启用 bevy_state 时会包含 StateTransition;如果裁掉该 feature,这个阶段不存在。

  启动 (仅执行一次):
  ┌──────────────────────────────────────────────┐
  │  StateTransition (OnEnter 初始状态)           │
  │  PreStartup → Startup → PostStartup          │
  └──────────────────────────────────────────────┘

  每帧循环:
  ┌──────────────────────────────────────────────┐
  │  First                                       │
  │  ├─ 消息更新、时间更新                         │
  │  PreUpdate                                   │
  │  ├─ 输入处理、窗口事件                         │
  │  StateTransition                             │
  │  ├─ 状态转换 (OnExit / OnEnter)               │
  │  RunFixedMainLoop                            │
  │  ├─ FixedFirst → FixedPreUpdate → FixedUpdate │
  │  │  → FixedPostUpdate → FixedLast            │
  │  Update                                      │
  │  ├─ 用户游戏逻辑 (主要写 System 的地方)        │
  │  SpawnScene                                  │
  │  ├─ 执行场景实例化                            │
  │  PostUpdate                                  │
  │  ├─ Transform 传播、渲染提取                   │
  │  Last                                        │
  │  ├─ 帧末清理                                  │
  └──────────────────────────────────────────────┘

图 C-1: 主循环 Schedule 执行顺序

Schedule 标签详解

启动阶段 (仅运行一次)

Schedule用途典型内容
PreStartup启动前的准备底层系统初始化
Startup应用启动场景加载、初始实体 spawn
PostStartup启动后处理依赖 Startup 数据的初始化

每帧阶段

Schedule用途典型内容
First帧开头消息更新、时间更新
PreUpdate更新前输入事件处理、窗口事件
StateTransition状态切换运行 OnExit/OnTransition/OnEnter
RunFixedMainLoop固定步驱动根据累计时间决定 FixedMain 执行次数
Update主更新用户游戏逻辑
SpawnScene场景实例化执行场景生成请求
PostUpdate更新后Transform 传播、可见性计算、渲染数据提取
Last帧末尾清理、诊断收集

固定时间步

Schedule用途说明
FixedFirst固定步开头固定步时间更新
FixedPreUpdate固定步前处理物理引擎预处理
FixedUpdate固定步主循环物理模拟、确定性逻辑
FixedPostUpdate固定步后处理物理后处理
FixedLast固定步末尾固定步清理

渲染阶段

Schedule用途说明
ExtractSchedule数据提取Main World → Render World 复制
Render渲染执行GPU 指令提交

状态转换

Schedule用途说明
StateTransition状态机转换运行 OnExit/OnTransition/OnEnter
OnEnter(S)进入状态 S状态初始化逻辑
OnExit(S)离开状态 S状态清理逻辑
OnTransition { exited, entered }状态转换从一个状态到另一个状态的过渡逻辑

内置 SystemSet

引擎核心 SystemSet

SystemSetSchedule说明
TransformSystem::TransformPropagatePostUpdateTransform 层级传播
VisibilitySystem::*PostUpdate可见性计算
AnimationSystem::*PostUpdate动画评估

输入 SystemSet

SystemSetSchedule说明
InputSystemPreUpdate输入事件处理

渲染 SystemSet

SystemSetSchedule说明
RenderSet::ExtractCommandsRender提取命令执行
RenderSet::PrepareRenderGPU 资源准备
RenderSet::QueueRender渲染队列构建
RenderSet::RenderRenderGPU 指令提交
RenderSet::CleanupRender渲染资源清理

顺序约束示例

#![allow(unused)]
fn main() {
// 用户系统添加到 Update
app.add_systems(Update, (
    input_handler,
    movement.after(input_handler),
    collision.after(movement),
));

// 固定时间步物理
app.add_systems(FixedUpdate, (
    apply_forces,
    integrate_velocity.after(apply_forces),
    detect_collisions.after(integrate_velocity),
));

// 状态系统
app.add_systems(OnEnter(GameState::Playing), setup_game);
app.add_systems(OnExit(GameState::Playing), cleanup_game);
}