#graphics #wgpu #profiler #scope #queries #timer #thread-safe

wgpu-profiler

使用计时查询的简单wgpu分析器作用域

25个版本 (16个重大变更)

0.18.0 2024年8月1日
0.17.0 2024年5月12日
0.16.2 2024年3月24日
0.15.0 2023年10月26日
0.3.1 2021年3月6日

#30图形API

Download history 498/week @ 2024-05-04 749/week @ 2024-05-11 507/week @ 2024-05-18 576/week @ 2024-05-25 758/week @ 2024-06-01 423/week @ 2024-06-08 500/week @ 2024-06-15 694/week @ 2024-06-22 358/week @ 2024-06-29 483/week @ 2024-07-06 550/week @ 2024-07-13 577/week @ 2024-07-20 473/week @ 2024-07-27 377/week @ 2024-08-03 419/week @ 2024-08-10 421/week @ 2024-08-17

每月 1,818 次下载
用于 11 个crate(6个直接)

MIT/Apache

71KB
1K SLoC

wgpu-profiler

Crates.io

使用计时查询的简单wgpu分析器作用域

功能

  • 易于使用的分析器作用域
    • 允许嵌套!
    • 可以通过运行时标志禁用
    • 此外还生成调试标记
    • 线程安全 - 可以并行分析多个命令编码器/缓冲区
  • 自动创建计时查询池
    • 不需要事先知道需要多少查询/分析器作用域
    • 缓存分析器帧直到结果可用
      • 任何时候都不会阻塞设备!
  • 许多分析器实例可以并行运行
  • chrome trace flamegraph json导出
  • Tracy集成(在tracy功能标志之后)

如何使用

创建一个新的分析器对象

use wgpu_profiler::{wgpu_profiler, GpuProfiler, GpuProfilerSettings};
// ...
let mut profiler = GpuProfiler::new(GpuProfilerSettings::default());

现在您可以开始创建分析器作用域

// You can now open profiling scopes on any encoder or pass:
let mut scope = profiler.scope("name of your scope", &mut encoder, &device);

// Scopes can be nested arbitrarily!
let mut nested_scope = scope.scope("nested!", &device);

// Scopes on encoders can be used to easily create profiled passes!
let mut compute_pass = nested_scope.scoped_compute_pass("profiled compute", &device);

// Scopes expose the underlying encoder or pass they wrap:
compute_pass.set_pipeline(&pipeline);
// ...

// Scopes created this way are automatically closed when dropped.

GpuProfiler 在第一次使用时读取设备功能

  • wgpu::Features::TIMESTAMP_QUERY 是发出任何计时查询所必需的。
    • 单独使用,这允许您在通道定义时使用时间戳写入,就像使用 Scope::scoped_compute_pass/Scope::scoped_render_pass 一样
  • wgpu::Features::TIMESTAMP_QUERY_INSIDE_ENCODERS 是在编码器中的任何位置发出查询所必需的。
  • wgpu::Features::TIMESTAMP_QUERY_INSIDE_PASSES 是在通道中的任何位置发出查询所必需的。

Wgpu-profiler 需要插入缓冲区复制命令,因此当您完成编码器并不会对其执行更多分析器作用域时,您需要解决查询

profiler.resolve_queries(&mut encoder);

最后,要结束一个分析帧,请调用 end_frame。这将执行一些检查,并会告知您是否有问题出现!

profiler.end_frame().unwrap();

检索最旧的可用帧并将其写入Chrome跟踪文件。

if let Some(profiling_data) = profiler.process_finished_frame(queue.get_timestamp_period()) {
    wgpu_profiler::chrometrace::write_chrometrace(std::path::Path::new("mytrace.json"), &profiling_data);
}

要查看其实际运行情况,请查看示例项目

许可证

根据以下任一许可证授权:

供您选择。

贡献

除非您明确说明,否则您根据Apache-2.0许可证定义,有意提交的任何贡献,包括在作品中包含的贡献,都将按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~3–35MB
~534K SLoC