4. 性能指标定义:帧率、延迟、抖动与吞吐量

在 Camera HAL 链路调优中,性能指标是衡量系统质量与瓶颈定位的标尺。本章定义四个核心指标——帧率(FPS)、延迟(Latency)、抖动(Jitter)与吞吐量(Throughput),并给出在 HAL 层与驱动层的标准测量方法。

调优前提: 所有指标必须在 稳定光源 与 固定场景 下测量,避免自动曝光/白平衡引入额外变量。测量前需预热 30 秒以上,使 sensor 与 ISP 进入稳态。

4.1 帧率(FPS)

定义: 单位时间内 Camera 系统输出完整帧的数量,单位 fps(frames per second)。Preview 链路通常要求 30 fps,Capture 链路要求 10~30 fps(取决于分辨率与 HDR 模式)。

测量方法:

  • HAL 层打点: 在 processCaptureRequest 入口与 notify 回调中记录时间戳,统计 1 秒内完成的帧数。
  • 驱动层: 通过 v4l2-ctl --stream-mmap --stream-count=300 采集 300 帧,计算平均 FPS。
  • 应用层: 使用 dumpsys media.camera 查看 mFpsRange 与实际输出帧率。
关键公式: FPS = 完成帧数 / 测量时间窗口(秒)。
测量窗口建议 ≥ 5 秒,避免短时波动影响均值。
帧率测量流程(HAL 层打点) processCaptureRequest HAL 内部处理 notify 回调 统计 1s 内帧数

4.2 延迟(Latency)

定义: 从触发请求到对应帧数据到达应用层的总耗时,单位 ms。Preview 延迟通常要求 < 50 ms,Capture 延迟 < 100 ms(单帧)。

分类:

延迟类型测量区间典型值(1080p@30fps)
Sensor 曝光延迟曝光开始 → RAW 数据输出16~33 ms
ISP 处理延迟RAW 输入 → YUV/JPEG 输出8~20 ms
HAL 框架延迟request 入队 → notify 回调2~5 ms
端到端延迟用户点击 → 预览帧显示40~80 ms

测量方法:

  • 硬件打点: 使用 GPIO 或 ftrace 标记 sensor VSYNC 与 ISP 输出时刻。
  • 软件打点: 在 HAL 的 processCaptureRequest 与 processCaptureResult 中插入 clock_gettime(CLOCK_MONOTONIC)。
  • 工具: perfetto 或 systrace 抓取 Camera 服务与 HAL 的 trace 事件。
常见误区: 应用层显示的帧时间戳可能经过 BufferQueue 排队,不能直接用于 HAL 延迟计算。务必在 HAL 内部使用硬件时间戳。
端到端延迟分解 Sensor 曝光 ISP HAL BufferQueue App 总延迟 = Sensor + ISP + HAL + BufferQueue + App 处理

4.3 抖动(Jitter)

定义: 帧间间隔(Inter-Frame Interval)的变异程度,反映帧率稳定性。单位 ms 或 %。高抖动会导致预览卡顿、视频录制丢帧。

计算公式:

Jitter = stddev(Δt₁, Δt₂, ..., Δtₙ)
其中 Δtᵢ = timestampᵢ - timestampᵢ₋₁

测量方法:

  • 帧时间戳分析: 从 processCaptureResult 中提取 timestamp 字段,计算连续帧间隔。
  • 工具: cameralog -j 或自定义脚本解析 dumpsys media.camera 的帧时间戳列表。
  • 阈值: 对于 30 fps 目标,帧间隔应为 33.33 ms。抖动 < 2 ms 为优秀,< 5 ms 为可接受,> 10 ms 需优化。
抖动 vs 丢帧: 抖动是帧间隔波动,丢帧是帧完全缺失。两者常伴生,但抖动是更敏感的早期预警指标。
帧间隔抖动示意图(30 fps 目标) 理想:33.33 ms 等间隔 抖动:间隔 28 ms / 38 ms / 32 ms / 45 ms

4.4 吞吐量(Throughput)

定义: 单位时间内 Camera 系统处理的数据量,单位 MB/s 或 MP/s(百万像素/秒)。反映带宽瓶颈与处理能力。

关键公式:

Throughput (MB/s) = 帧率 (fps) × 单帧数据量 (MB)
单帧数据量 = 宽 × 高 × 像素位深 / 8 / 1024 / 1024

典型场景:

场景分辨率格式单帧大小目标 FPS吞吐量
Preview1920×1080NV12~3.1 MB30~93 MB/s
Capture4000×3000JPEG~3~6 MB15~45~90 MB/s
Video 4K3840×2160NV12~12.4 MB30~372 MB/s

测量方法:

  • 带宽测量: 使用 perf stat -e ddr_bandwidth 或 busybox devmem 读取 DDR 控制器计数器。
  • HAL 层统计: 在 processCaptureResult 中累加 buffer.size,除以时间窗口。
  • 瓶颈定位: 对比实际吞吐量与理论带宽,若低于 70% 则需检查 ISP 时钟、DDR 频率或 DMA 配置。
注意: 吞吐量受 DDR 带宽、ISP 时钟、MIPI CSI 速率 三重限制。调优时需逐级排查,避免盲目提升帧率导致系统过载。
吞吐量瓶颈链路 Sensor 输出 MIPI CSI ISP 处理 DDR 写入 瓶颈点:MIPI 速率 < ISP 处理能力 < DDR 带宽 实际吞吐量 = min(各环节吞吐量)

4.5 指标关联与调优优先级

四个指标相互影响,调优时需权衡:

  • FPS vs Latency: 提高 FPS 通常降低单帧延迟,但可能增加 ISP 负载导致抖动。
  • Jitter vs Throughput: 高吞吐量接近带宽极限时,抖动必然增大。
  • 调优顺序: 先保证 FPS 达标 → 再优化延迟 → 控制抖动 → 最后验证吞吐量不超限。
实战建议: 在 HAL 层实现 环形缓冲区 记录最近 100 帧的 FPS、延迟、抖动与吞吐量,通过 dumpsys 导出,便于现场分析。