Skip to content

无头模式与平台细节

有些场景不需要窗口:服务器、批处理工具、自动化测试。Bevy 的无头模式通过 WindowPlugin 配置实现。

rust
use bevy::prelude::*;
use bevy::window::{ExitCondition, WindowPlugin};

fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            primary_window: None,
            exit_condition: ExitCondition::DontExit,
            ..default()
        }))
        .add_systems(Startup, setup)
        .add_systems(Update, tick)
        .run();
}

fn setup() {
    info!("无头模式——没有窗口,纯逻辑运行");
}

fn tick(mut frame: Local<u32>, mut exit: MessageWriter<AppExit>) {
    *frame += 1;
    let f = *frame;
    if f % 60 == 0 {
        info!("逻辑帧 {}", f);
    }
    if f >= 300 {
        info!("300 帧后自行退出");
        exit.write(AppExit::Success);
    }
}

Listing 35-5:无头模式——没有窗口的纯逻辑运行

无头模式配置

rust
WindowPlugin {
    primary_window: None,              // 不创建主窗口
    exit_condition: ExitCondition::DontExit,  // 不因无窗口而退出
    ..default()
}

ExitCondition 有三个变体:

变体行为
OnAllClosed所有窗口关闭时退出(默认)
OnPrimaryClosed主窗口关闭时退出
DontExit不自动退出,需要手动发送 AppExit

无头模式下,渲染系统仍然运行但不会输出到屏幕。如果你连渲染都不需要,可以用 MinimalPlugins 替代 DefaultPlugins

bevy_a11y:无障碍概述

bevy_a11y 提供了无障碍支持的基础设施:

  • AccessibilityPlugin:自动为 UI 元素生成无障碍树
  • accesskit 集成:通过平台原生的无障碍 API(Windows UI Automation、macOS Accessibility 等)暴露信息
  • 支持屏幕阅读器、键盘导航等

无障碍功能由 DefaultPlugins 自动启用。如果你的 UI 使用了 Bevy 的 TextButton 等组件,它们会自动被无障碍系统识别。

bevy_platform 与 no_std 概述

bevy_platform 是一个底层工具 crate,提供:

  • 平台抽象:InstantDurationthread 等跨平台封装
  • no_std 兼容:在没有标准库的环境(嵌入式、WASM 等)下提供替代实现
  • 同步原语:MutexRwLockOnceLock

对于大多数应用,你不需要直接使用 bevy_platform。它主要供 Bevy 内部 crate 使用。但了解它的存在有助于理解 Bevy 如何做到跨平台编译。