SuperAPI AI 工具集

bevy-debugging-profiling

编程与开发

查看项目

更新于 10-16 06:08

技能介绍

用途

当运行中的应用需要打印日志,或记录帧时间、实体数量、进程 CPU 与内存占用时,可加载本技能。它面向 Bevy 0.20+,围绕日志与诊断两类能力展开。

主要能力

日志(LogPlugin)

LogPlugin 是 DefaultPlugins 的一部分。可通过 DefaultPlugins.set(LogPlugin { level, filter, .. }) 覆盖其配置。示例使用 Level::DEBUG 以及类似 wgpu=error,bevy_render=info,bevy_ecs=trace 的过滤字符串。同一过滤字符串也可用作 RUST_LOG。若要接入自己的收集器,可在 DefaultPlugins 上禁用该插件。

诊断核心

DiagnosticsPlugin 添加核心资源。DiagnosticsStore 保存采集结果。Diagnostic 是由 DiagnosticPath 寻址的 DiagnosticMeasurement 值组成的时间线。RegisterDiagnostic 为 App 添加 register_diagnostic 方法。

内置插件

  • FrameTimeDiagnosticsPlugin:添加帧时间、fps 和帧计数。
  • EntityCountDiagnosticsPlugin:添加实体数量。
  • SystemInformationDiagnosticsPlugin:添加 cpu_usage 和 mem_usage 百分比。
  • LogDiagnosticsPlugin:将诊断信息打印到控制台。
  • FrameCount / FrameCountPlugin:统计自启动以来的帧数。

顺序方面,log-diagnostics 示例在 DefaultPlugins 之后添加这些插件,因为它们使用 time 插件生成时间戳。

调度

内置插件自行进行测量。当 HUD 需要最新样本时,读取 DiagnosticsStore。只有需要测量自己定义的值时,才注册 Diagnostic。

使用方式

配置日志

use bevy::log::{Level, LogPlugin};

fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(LogPlugin {
            filter: "wgpu=error,bevy_render=info,bevy_ecs=trace".into(),
            level: Level::DEBUG,
            ..default()
        }))
        .run();
}

添加诊断插件

use bevy::diagnostic::{
    EntityCountDiagnosticsPlugin, FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin,
    SystemInformationDiagnosticsPlugin,
};

fn main() {
    App::new()
        .add_plugins((
            DefaultPlugins,
            FrameTimeDiagnosticsPlugin::default(),
            EntityCountDiagnosticsPlugin {
                max_history_length: 60,
            },
            SystemInformationDiagnosticsPlugin,
            LogDiagnosticsPlugin::default(),
        ))
        .run();
}

在 HUD 中读取帧时间

use bevy::diagnostic::{DiagnosticsStore, FrameTimeDiagnosticsPlugin};

fn read_frame_time(store: Res<DiagnosticsStore>) {
    let Some(frame) = store.get(&FrameTimeDiagnosticsPlugin::FRAME_TIME) else {
        return;
    };
    let Some(ms) = frame.smoothed() else {
        return;
    };
    info!("frame {ms:.2} ms");
}

注册自定义诊断

自定义计数器由一个 DiagnosticPath 加 register_diagnostic 构成。一个系统写入测量值,其他任何地方都不应修改该路径。

use bevy::diagnostic::{Diagnostic, DiagnosticPath, Diagnostics, RegisterDiagnostic};

const LIVE_ENEMIES: DiagnosticPath = DiagnosticPath::const_new("game/live_enemies");

#[derive(Component)]
struct Enemy;

fn install(app: &mut App) {
    app.register_diagnostic(Diagnostic::new(LIVE_ENEMIES).with_max_history_length(60));
}

fn measure_enemies(mut diagnostics: Diagnostics, enemies: Query<(), With<Enemy>>) {
    let count = enemies.iter().count() as f64;
    diagnostics.add_measurement(&LIVE_ENEMIES, || count);
}

适用场景

  • 运行中的应用需要输出日志,并调整日志级别或过滤规则。
  • 需要采集帧时间、FPS、帧数、实体数量、进程 CPU 与内存占用等运行指标。
  • 需要将诊断信息打印到控制台。
  • 需要在 HUD 中读取最新诊断样本。
  • 需要注册并测量自定义的数值。

限制

  • 逐系统火焰图和 Tracy 不在本技能范围内。
  • 本技能不将诊断信息转发到渲染应用。
  • 不涉及物理、导航、网络或 XR crate。
  • 不涉及第三方性能分析 crate。
  • 不包含本文件未打开的外部性能分析器设置。
  • 自定义测量使用 Diagnostic、DiagnosticPath 和 register_diagnostic,如上述示例。

相关技能

  • 前置:bevy-master(状态归属)、bevy-project-foundations(DefaultPlugins 与 App)。
  • 互补:bevy-performance(帧时间数字的用途)。
  • 下游/消费者:暂无。
  • 主技能:bevy-master(Bevy 路由)。