3. 图形性能基础指标
在 Linux 图形栈中,性能问题往往不是“慢”这么简单,而是“哪一段慢、慢在什么指标上、是否值得优化”。帧率、帧时间、延迟、吞吐量、GPU 利用率、显存带宽、功耗与能效,是描述图形系统运行状态的八个基础维度。它们彼此关联,但绝不等价:高帧率不等于低延迟,高 GPU 利用率不等于高吞吐,低功耗也可能以牺牲帧时间为代价。理解每个指标的物理含义、采集位置和工具链,是后续定位瓶颈、验证优化效果的前提。
一、核心指标的定义与度量位置
帧率(FPS)表示单位时间内完成的帧数量,反映整体流畅度;帧时间(Frame Time)是相邻两帧提交或呈现之间的时间间隔,通常以毫秒计,比 FPS 更能暴露卡顿和抖动。延迟(Latency)是从输入事件发生到画面产生可感知响应的时间,包含输入采样、应用逻辑、GPU 渲染、合成与显示扫描等多个阶段。吞吐量(Throughput)描述单位时间内系统能处理的工作量,例如每秒绘制的三角形数、像素填充率或纹理上传字节数。
GPU 利用率表示 GPU 在采样周期内处于忙碌状态的时间比例,但它不区分“有效忙碌”和“等待依赖导致的空转”。显存带宽是 GPU 与显存之间实际传输的数据速率,常用 GB/s 表示,受分辨率、纹理格式、压缩方式和访问模式影响。功耗是单位时间的能量消耗,能效则是“每瓦性能”,例如 FPS/W 或每帧焦耳数。度量这些指标时,必须记录采集点:是应用层、驱动层、GPU 硬件计数器,还是显示控制器。
二、度量方法与常用工具
帧率与帧时间最直接的采集方式是应用内计时,但更可靠的是结合显示子系统事件。在 Linux 上,DRM/KMS 的 page flip 事件可以给出真实的呈现时刻,避免只统计“提交”而忽略“显示”。延迟测量通常需要输入注入与画面检测配合,例如使用高帧率相机或硬件时间戳。吞吐量、GPU 利用率和显存带宽则依赖 GPU 厂商提供的性能计数器,如 Intel 的 i915 perf、AMD 的 GPUPerfAPI、NVIDIA 的 Nsight 或通用层的 gpuvis。
功耗与能效的采集需要区分芯片级和板级。Intel RAPL、AMD 的 power_dpm_force_performance_level、NVIDIA 的 nvidia-smi 都能读取 GPU 功耗;整机功耗则依赖外接功率计。能效计算必须固定工作负载和分辨率,否则不同场景的 FPS/W 没有可比性。
# 查看 DRM 页面翻转与帧事件
sudo cat /sys/kernel/debug/dri/0/amdgpu_gpu_recover 2>/dev/null
sudo perf stat -e drm:drm_vblank_event -a sleep 5
# 使用 intel_gpu_top 观察 GPU 利用率与显存带宽
sudo intel_gpu_top -l
# 使用 nvidia-smi 读取功耗与利用率
nvidia-smi --query-gpu=utilization.gpu,power.draw,memory.used --format=csv -l 1
# 使用 ftrace 跟踪帧提交到呈现的延迟
sudo trace-cmd record -e drm:drm_vblank_event -e drm:drm_flip_done
三、典型场景:从帧时间抖动定位到显存带宽瓶颈
假设一个 Wayland 合成器场景中,用户反馈“偶尔卡一下”。首先采集帧时间序列,发现平均帧时间 16.7 ms,但每 2 秒出现一次 40 ms 尖峰。接着查看 GPU 利用率,发现尖峰期间利用率并未升高,说明不是计算量突增。进一步用带宽计数器发现,尖峰时刻显存带宽接近峰值,同时伴随一次大纹理上传。最终定位为应用在特定时刻上传未压缩纹理,挤占了合成器的带宽。优化手段包括纹理压缩、异步上传和双缓冲,而不是盲目降低分辨率。
四、常见误区与复盘清单
- 误区一:FPS 高就一定流畅。 帧时间方差大时,平均 FPS 再高也会出现可感知卡顿。
- 误区二:GPU 利用率 100% 就是瓶颈。 利用率高可能只是轮询或等待,需结合吞吐量和队列深度判断。
- 误区三:显存带宽只看理论值。 实际带宽受访问模式、压缩和缓存命中率影响,必须用硬件计数器实测。
- 误区四:能效只算 FPS/W。 还应关注每帧焦耳数和热约束下的持续性能,避免短时冲高后降频。
| 指标 | 物理含义 | 常用工具/接口 | 典型陷阱 |
|---|---|---|---|
| 帧率 FPS | 单位时间完成帧数 | 应用计时、DRM vblank | 平均值掩盖抖动 |
| 帧时间 | 相邻帧间隔 | ftrace、gpuvis | 只测提交不测呈现 |
| 延迟 | 输入到可见响应 | 硬件时间戳、高速相机 | 忽略合成与扫描 |
| 吞吐量 | 单位时间处理量 | GPU 计数器、perf | 与利用率混淆 |
| GPU 利用率 | 忙碌时间占比 | intel_gpu_top、nvidia-smi | 不区分有效忙碌 |
| 显存带宽 | 实际数据传输速率 | 厂商计数器、gpuvis | 只看理论峰值 |
| 功耗/能效 | 能量消耗与每瓦性能 | RAPL、功率计、nvidia-smi | 未固定负载比较 |
复盘时建议固定三件事:同一工作负载、同一分辨率与刷新率、同一采集窗口。只有控制变量,指标才有可比性。图形性能优化不是追求单一指标的最大值,而是在帧时间、延迟、吞吐、带宽、功耗之间找到满足体验约束的平衡点。