性能分析工具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中显示堆栈信息。
- Windows/MSVC 支持:
- 使用 _aligned_malloc 和 _aligned_free(Windows 特定 API)
- 包含 <malloc.h> 头文件
- Linux/其他平台支持:
- 使用 std::aligned_alloc 和 std::free
- 包含
头文件
- 平台检测:
- 使用 #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 型号、频率、执行上下文切换等)。 |