3. 图形性能基础指标

在 Linux 图形栈中,性能问题往往不是“慢”这么简单,而是“哪一段慢、慢在什么指标上、是否值得优化”。帧率、帧时间、延迟、吞吐量、GPU 利用率、显存带宽、功耗与能效,是描述图形系统运行状态的八个基础维度。它们彼此关联,但绝不等价:高帧率不等于低延迟,高 GPU 利用率不等于高吞吐,低功耗也可能以牺牲帧时间为代价。理解每个指标的物理含义、采集位置和工具链,是后续定位瓶颈、验证优化效果的前提。

核心原则:先明确“用户感知指标”与“系统资源指标”的层次关系。帧率、帧时间、延迟属于体验层;吞吐量、GPU 利用率、显存带宽属于资源层;功耗与能效属于代价层。优化时通常从体验层发现问题,再到资源层找原因,最后用能效层判断方案是否可持续。

一、核心指标的定义与度量位置

帧率(FPS)表示单位时间内完成的帧数量,反映整体流畅度;帧时间(Frame Time)是相邻两帧提交或呈现之间的时间间隔,通常以毫秒计,比 FPS 更能暴露卡顿和抖动。延迟(Latency)是从输入事件发生到画面产生可感知响应的时间,包含输入采样、应用逻辑、GPU 渲染、合成与显示扫描等多个阶段。吞吐量(Throughput)描述单位时间内系统能处理的工作量,例如每秒绘制的三角形数、像素填充率或纹理上传字节数。

GPU 利用率表示 GPU 在采样周期内处于忙碌状态的时间比例,但它不区分“有效忙碌”和“等待依赖导致的空转”。显存带宽是 GPU 与显存之间实际传输的数据速率,常用 GB/s 表示,受分辨率、纹理格式、压缩方式和访问模式影响。功耗是单位时间的能量消耗,能效则是“每瓦性能”,例如 FPS/W 或每帧焦耳数。度量这些指标时,必须记录采集点:是应用层、驱动层、GPU 硬件计数器,还是显示控制器。

图形性能指标分层与采集位置 体验层(用户可感知) 帧率 FPS 帧时间 Frame Time 延迟 Latency 输入到呈现端到端 资源层(系统内部状态) 吞吐量 三角形/像素/纹理上传 GPU 利用率 忙碌时间占比 显存带宽 GB/s 实际传输 队列深度 提交/完成差 代价层(可持续性) 功耗 Power (W) 能效 FPS/W 或 J/帧 热与频率约束 采集工具链: 应用埋点 → DRM/KMS 事件 → GPU 硬件计数器 → perf/ftrace → 功耗传感器

二、度量方法与常用工具

帧率与帧时间最直接的采集方式是应用内计时,但更可靠的是结合显示子系统事件。在 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 利用率,发现尖峰期间利用率并未升高,说明不是计算量突增。进一步用带宽计数器发现,尖峰时刻显存带宽接近峰值,同时伴随一次大纹理上传。最终定位为应用在特定时刻上传未压缩纹理,挤占了合成器的带宽。优化手段包括纹理压缩、异步上传和双缓冲,而不是盲目降低分辨率。

排障顺序建议:先看帧时间分布,再看 GPU 利用率与队列深度,最后看显存带宽和功耗。不要一上来就调频率或降画质,否则容易掩盖真实瓶颈。

四、常见误区与复盘清单

  • 误区一:FPS 高就一定流畅。 帧时间方差大时,平均 FPS 再高也会出现可感知卡顿。
  • 误区二:GPU 利用率 100% 就是瓶颈。 利用率高可能只是轮询或等待,需结合吞吐量和队列深度判断。
  • 误区三:显存带宽只看理论值。 实际带宽受访问模式、压缩和缓存命中率影响,必须用硬件计数器实测。
  • 误区四:能效只算 FPS/W。 还应关注每帧焦耳数和热约束下的持续性能,避免短时冲高后降频。
指标 物理含义 常用工具/接口 典型陷阱
帧率 FPS 单位时间完成帧数 应用计时、DRM vblank 平均值掩盖抖动
帧时间 相邻帧间隔 ftrace、gpuvis 只测提交不测呈现
延迟 输入到可见响应 硬件时间戳、高速相机 忽略合成与扫描
吞吐量 单位时间处理量 GPU 计数器、perf 与利用率混淆
GPU 利用率 忙碌时间占比 intel_gpu_top、nvidia-smi 不区分有效忙碌
显存带宽 实际数据传输速率 厂商计数器、gpuvis 只看理论峰值
功耗/能效 能量消耗与每瓦性能 RAPL、功率计、nvidia-smi 未固定负载比较

复盘时建议固定三件事:同一工作负载、同一分辨率与刷新率、同一采集窗口。只有控制变量,指标才有可比性。图形性能优化不是追求单一指标的最大值,而是在帧时间、延迟、吞吐、带宽、功耗之间找到满足体验约束的平衡点。