Optick:轻量级 C++ 游戏性能分析器
December 25, 2024About 2 min
Optick:轻量级 C++ 游戏性能分析器
Optick 是一个面向游戏的超轻量 C++ profiler,集成简单、CPU/GPU 能放在同一帧里一起看,适合做日常性能分析和优化。
支持的平台与图形 API
| 能力 | Windows | Linux | macOS | Xbox | PS4 | UE4 | Switch |
|---|---|---|---|---|---|---|---|
| 插桩(Instrumentation) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |
| 上下文切换(Switch Context) | ✔ | ✔ | ✔ | ✔ | ✔ | ||
| 采样(Sampling) | ✔ | ✔ | ✔ | ||||
| GPU | ✔ | ✔ | ✔ | ✔ |
图形 API 方面,GPU 计时目前只支持 DX12、Vulkan、NVN(Switch)。Switch 平台官方未直接支持,需要自己拉一个移植分支来跑。
优缺点
优点:集成和使用都很简单;能把 CPU 和 GPU 放在同一帧里对照分析。
缺点:工作在用户态,拿不到内核态/图形驱动层的底层性能细节;GPU 计时目前只覆盖 Vulkan 和 DX12。
怎么集成
基础集成(CPU)
- 引入 Optick 头文件,链接 lib/dll
- 每帧开始前调
OPTICK_FRAME(...) - 用
OPTICK_THREAD(...)声明一个新线程 - 用
OPTICK_EVENT(...)给函数/作用域插桩
GPU 集成
- 设备初始化后调
OPTICK_GPU_INIT_D3D12(...)或OPTICK_GPU_INIT_VULKAN(...) - present 前调
OPTICK_GPU_FLIP(...) - 用
OPTICK_GPU_CONTEXT(...)声明当前 command list,用OPTICK_GPU_EVENT(...)圈出 GPU Event
抓取数据
代码里可以自动控制抓取:
OPTICK_START_CAPTURE(...)开始一段新抓取OPTICK_STOP_CAPTURE(...)停止当前抓取OPTICK_SAVE_CAPTURE(...)保存当前抓取
更常用的是配合 Optick Profiler GUI:启动游戏和 Optick Profiler,填目标机器的 IP 开始 profiling,停止后等结果回传。


用 Optick Profiler 分析
抓取参数在 Capture Settings 里配:

抓完进结果界面,可以按帧看整体耗时分布:

Function Table 列出各函数的 Self/Total/Max 耗时和调用次数,定位热点很直接:

Function Tree / Flamegraph 能看线程调用栈和各核心的上下文运行情况——上面这张图里 GPU 这帧花了 22ms 还在等 CPU 提交命令,而 CPU 大头压在 lighting pass 和 shadow pass 上,CPU/GPU 的瓶颈一目了然:

判断 CPU Bound 还是 GPU Bound
把 CPU 帧和 GPU 帧叠在一起看:如果 GPU 帧明显比 CPU 帧长、CPU 在等 present,就是 GPU bound;反过来 GPU 大段空闲、CPU 满负荷就是 CPU bound。
