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 秒,避免短时波动影响均值。
测量窗口建议 ≥ 5 秒,避免短时波动影响均值。
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 内部使用硬件时间戳。
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 丢帧: 抖动是帧间隔波动,丢帧是帧完全缺失。两者常伴生,但抖动是更敏感的早期预警指标。
4.4 吞吐量(Throughput)
定义: 单位时间内 Camera 系统处理的数据量,单位 MB/s 或 MP/s(百万像素/秒)。反映带宽瓶颈与处理能力。
关键公式:
Throughput (MB/s) = 帧率 (fps) × 单帧数据量 (MB)
单帧数据量 = 宽 × 高 × 像素位深 / 8 / 1024 / 1024
典型场景:
| 场景 | 分辨率 | 格式 | 单帧大小 | 目标 FPS | 吞吐量 |
|---|---|---|---|---|---|
| Preview | 1920×1080 | NV12 | ~3.1 MB | 30 | ~93 MB/s |
| Capture | 4000×3000 | JPEG | ~3~6 MB | 15 | ~45~90 MB/s |
| Video 4K | 3840×2160 | NV12 | ~12.4 MB | 30 | ~372 MB/s |
测量方法:
- 带宽测量: 使用
perf stat -e ddr_bandwidth或busybox devmem读取 DDR 控制器计数器。 - HAL 层统计: 在
processCaptureResult中累加buffer.size,除以时间窗口。 - 瓶颈定位: 对比实际吞吐量与理论带宽,若低于 70% 则需检查 ISP 时钟、DDR 频率或 DMA 配置。
注意: 吞吐量受 DDR 带宽、ISP 时钟、MIPI CSI 速率 三重限制。调优时需逐级排查,避免盲目提升帧率导致系统过载。
4.5 指标关联与调优优先级
四个指标相互影响,调优时需权衡:
- FPS vs Latency: 提高 FPS 通常降低单帧延迟,但可能增加 ISP 负载导致抖动。
- Jitter vs Throughput: 高吞吐量接近带宽极限时,抖动必然增大。
- 调优顺序: 先保证 FPS 达标 → 再优化延迟 → 控制抖动 → 最后验证吞吐量不超限。
实战建议: 在 HAL 层实现 环形缓冲区 记录最近 100 帧的 FPS、延迟、抖动与吞吐量,通过
dumpsys 导出,便于现场分析。