性能分析工具Tracy

配置

Tracy工具是支持分析 CPU(为 C、C++ 和 Lua 集成提供直接支持。同时,互联网上存在许多其他语言的第三方绑定,例如 Rust 、Zig、C # 、 OCaml 、 Odin等。 )、GPU(所有主要图形 API:OpenGL、Vulkan、Direct3D 11/12、OpenCL。)、内存分配、锁定、上下文切换、自动将屏幕截图归因于捕获的帧等等。

有两个部分组成,一个是客户端,一个是服务器。客户端负责的是采样数据,也就是我们要分析的程序,服务器是采样数据的接受者,同时也是一个数据的viewer,可以支持数据存储和导出csv。

它的使用方法简单,也可以十分方便地集成在我们的项目中,一个是使用vcpkg来管理这些模块,一个是使用camke 3.11版本的fetch来作为CMake 的 FetchContent 模块。

!tip 他会自动下载到我们的out文件夹也就是构建目录下的_deps目录里面,会自动调用add_subdirectory(),将tracy的源码直接纳入我们的工程中,tracy会和我们的模块一起编译。 这种做法有很好的优点,一个是全自动化,一个是Debug友好,我们可以直接单步跳入,和保持静态链接一致性。

我们就可以直接使用,它会在编译之后一起放在输出模块中,我们只需要在可执行文件中将它链接进去就行:

target_link_libraries(DrawTriangle PRIVATE Graphics Foundation TracyClient)

追踪

整个函数的追踪的执行时间

我们可以在main函数下方直接插入ZoneScoped,这是Tracy中最常用的最标准的做法,如果没有给他命名,那么他就会使用cpp的预处理器比如说(FUNCTION__或者是__PRETTT_FUNCITON),这会自动抓取当前函数的命名。

他会追踪从这行开始到大括号结束的整个范围,这个在CPP中被称为RAII机制。它的开销极低,只有几纳秒到几十纳秒的延迟,并且我们编译Release版本的时候不加TRACY_ENABLE宏就不会启用,会被预处理器直接替换为空白,不会产生任何机器码,可以放心使用。 ![[Pasted image 20260101205838.png]]

标记帧边界

还有一个宏叫做FrameMark,他记录的是横向的信息比如说FPS和帧耗时,如果没有他的话,我们只能看到散乱的函数执行记录,有了它,Tracy的顶部界面会有FPS实时曲线,有帧耗时,会有帧过滤。

这个通常放在主循环的最后。![[Pasted image 20260101205957.png]]

![[Pasted image 20260101210021.png]]

内存追踪工具

如果我们需要开启内存追踪,我们需要在cmake中进行配置:![[Pasted image 20260101211643.png]] 开启这个编译选项,然后在我们的应用文件中编写相关逻辑![[Pasted image 20260101211728.png]] 重载操作符,来追踪所有的内存分配,所有的new/delate都会在Tracy中显示堆栈信息。

  1. Windows/MSVC 支持:
  • 使用 _aligned_malloc 和 _aligned_free(Windows 特定 API)
  • 包含 <malloc.h> 头文件
  1. Linux/其他平台支持:
  • 使用 std::aligned_alloc 和 std::free
  • 包含  头文件
  1. 平台检测:
  • 使用 #ifdef _WIN32 来区分 Windows 和其他平台

profiler工具

我们打开tracy官方的工具,有一个叫做tracy-profiler的工具,打开后我们保证之前的程序在运行,就可以链接上去,看到我们想看的任何信息:

![[Pasted image 20260101210138.png]] ![[Pasted image 20260101210142.png]]

这个工具还提供了很多的其他小功能,比如说统计功能,还有内存占用分析工具等。

常用的快捷键

这是在长达几分钟的录制中左右穿梭的核心:

快捷键动作
鼠标滚轮以光标位置为中心 缩放 时间轴(放大看微秒,缩小看全局)。
左键按住并拖动平移 时间轴。
W / S放大 / 缩小(滚轮的键盘替代方案)。
A / D向左 / 向右 平移时间轴。
Home跳转到录制的最 开始。
End跳转到录制的 末尾(实时查看当前状态)。
当你想在成千上万个 ZoneScoped 中找到你的 Yoga 布局函数时:
快捷键动作
Ctrl + F打开 全局搜索。可以搜索函数名、源文件名或自定义消息。
N打开 Find Zone 窗口,快速定位特定名称的区域。
Space (空格)居中并高亮 当前选中的区域。
Enter进入选中区域的详细统计信息视图。

测量和分析工具

快捷键动作
鼠标中键 (单击并拖动)测量工具。非常有用的“神技”,可以测量时间轴上任意两点之间的时间差(例如:测量从输入事件到画面显示的真实延迟)。
S打开 Statistics (统计) 视图。查看所有函数的平均耗时、总耗时百分比等。
C开启/关闭 连接线。显示父子函数之间的调用关系。
M打开 Messages 窗口,查看代码中 TracyMessage 发出的调试日志。

采样与内存 (Sampling & Memory)

针对 AOT 分析和内存监控需求:

快捷键动作
Y切换 采样堆栈 (Callstack) 的显示。
L切换 锁竞争 (Locks) 视图(如果你的 UI 框架涉及多线程锁)。
I查看当前的 系统信息(CPU 型号、频率、执行上下文切换等)。