2. Camera HAL 性能指标:定义与测量方法
在 Camera HAL 性能优化中,帧率 (FPS)、延迟 (Latency)、功耗 (Power) 和 内存占用 (Memory) 是四个核心指标。它们共同决定了相机系统的用户体验与资源效率。本章将逐一给出精确定义,并介绍业界标准的测量方法。
💡 核心观点: 四个指标相互耦合——提升帧率往往增加功耗与内存带宽,降低延迟可能牺牲帧率稳定性。优化时必须权衡全局,而非孤立调优。
2.1 帧率 (FPS)
定义
帧率(Frames Per Second)表示 Camera HAL 每秒向应用层交付的完整帧数量。单位是 fps。它直接反映画面的流畅度。
- Sensor 输出帧率:图像传感器原始输出速率,受曝光时间、增益、PLL 配置限制。
- HAL 处理帧率:经过 ISP、算法、Buffer 管理后,最终送达应用层的帧率。
- 稳定帧率 vs 峰值帧率:稳定帧率是长时间运行的平均值,峰值帧率是短时突发能力。
测量方法
| 方法 | 工具/命令 | 精度 | 适用场景 |
|---|---|---|---|
| dumpsys media.camera | adb shell dumpsys media.camera -v 1 | 中等 | 快速验证 HAL 层帧率 |
| SurfaceFlinger 帧统计 | adb shell dumpsys SurfaceFlinger --latency | 高 | 应用层显示帧率 |
| perfetto / systrace | perfetto 跟踪 HAL 生产事件 | 极高 | 逐帧分析、卡顿定位 |
| Camera 测试应用 | CTS / 自研 FPS 计数器 | 高 | 自动化回归测试 |
📐 测量要点: 测量帧率时需固定场景(如灰卡、固定光源),避免自动曝光/白平衡波动引入误差。至少采集 300 帧数据取平均值。
2.2 延迟 (Latency)
定义
延迟指从触发事件(如按下快门、光线变化)到对应帧到达应用层的时间差。关键子项包括:
- Sensor 延迟:曝光开始到 RAW 数据输出。
- ISP 管线延迟:RAW → YUV/JPEG 的处理时间。
- Buffer 排队延迟:帧在 HAL 与 SurfaceFlinger 之间等待的时间。
- 端到端延迟:从物理事件到屏幕显示的总时间。
测量方法
| 延迟类型 | 测量手段 | 典型值 (30fps) |
|---|---|---|
| Sensor 延迟 | 示波器 + VSYNC 信号 | 10-33 ms |
| ISP 管线延迟 | perfetto 跟踪 HAL 处理段 | 8-20 ms |
| Buffer 排队延迟 | dumpsys SurfaceFlinger --latency | 0-16 ms |
| 端到端延迟 | 光闪烁法 / 高速摄像 | 50-120 ms |
⚠️ 常见误区: 帧率 30fps 不代表延迟是 33ms。延迟可能因管线深度、Buffer 数量、调度抖动而远大于帧间隔。务必单独测量。
2.3 功耗 (Power)
定义
功耗指 Camera HAL 运行时整个相机子系统(Sensor、ISP、内存、总线)消耗的电功率。单位 mW 或 mA。关键分解:
- Sensor 功耗:取决于分辨率、帧率、HDR 模式。
- ISP 功耗:与处理负载、算法复杂度强相关。
- 内存带宽功耗:Buffer 分配、拷贝、压缩带来的动态功耗。
- 静态功耗:未关闭的时钟域、漏电流。
测量方法
| 测量层级 | 工具 | 精度 | 备注 |
|---|---|---|---|
| 整机功耗 | Monsoon / 功率计 | ±1 mW | 需扣除屏幕、CPU 空闲功耗 |
| 子系统功耗 | 板载 PMIC 电流采样 | ±5 mW | 需硬件支持 |
| 模块级功耗 | perfetto + 功耗模型 | ±10% | 软件估算,适合对比 |
| 动态功耗 | Trace + 频率/电压表 | 相对值 | 用于定位异常突增 |
🔋 优化原则: 功耗优化优先降低内存带宽(如压缩、减少拷贝),其次降低 ISP 频率,最后考虑 Sensor 降帧。每降低 100 mW 内存带宽功耗,可节省约 30-50 mW 整机功耗。
2.4 内存占用 (Memory)
定义
内存占用指 Camera HAL 运行时占用的 DRAM 空间,包括:
- Buffer 池:用于存放 RAW、YUV、JPEG 帧的循环缓冲区。
- 算法工作内存:3A 统计、HDR 融合、降噪等算法临时数据。
- 代码段:HAL 库、驱动、固件映射。
- 元数据:Camera 元数据、Request/Result 队列。
测量方法
| 测量对象 | 命令/方法 | 单位 | 说明 |
|---|---|---|---|
| HAL 进程 RSS | adb shell dumpsys meminfo cameraserver | KB | 包含共享库 |
| Buffer 池大小 | adb shell dumpsys media.camera -v 2 | MB | 按格式/分辨率列出 |
| ION/DMA-BUF | adb shell cat /d/ion/heaps/system | KB | 连续物理内存 |
| GPU 共享内存 | adb shell dumpsys gfxinfo | KB | 用于显示合成 |
⚠️ 内存泄漏检测: 反复打开/关闭 Camera 预览,每次对比 ION 内存和 RSS 是否持续增长。增长超过 5% 即需排查 Buffer 未释放或元数据泄漏。
2.5 四指标关联与权衡
四个指标并非独立,优化时需理解其内在耦合关系:
- 帧率 ↑ → 功耗 ↑:更高帧率意味着 Sensor 和 ISP 工作频率提升,动态功耗增加。
- 延迟 ↓ → 内存 ↑:为降低排队延迟,常需要更多 Buffer 做双缓冲或三缓冲,增加内存占用。
- 功耗 ↓ → 帧率 ↓ 或 延迟 ↑:降频、关核、减少 Buffer 拷贝会牺牲帧率或增加延迟。
- 内存 ↓ → 帧率不稳定:Buffer 池过小可能导致 dequeue 阻塞,引发帧率抖动。
🎯 优化策略: 先确定目标帧率(如 30fps 稳定),再测量当前延迟和功耗基线,最后在内存占用约束下调整 Buffer 数量和管线深度。每次只改一个变量,用 perfetto 验证效果。
2.6 测量工具链总结
| 指标 | 首选工具 | 辅助工具 | 自动化方案 |
|---|---|---|---|
| 帧率 | perfetto | dumpsys SurfaceFlinger | CTS 测试脚本 |
| 延迟 | perfetto + 示波器 | 高速摄像 | 自研 latency 测试 app |
| 功耗 | Monsoon 功率计 | PMIC 寄存器读取 | 自动化功耗采集脚本 |
| 内存 | dumpsys meminfo | ION 调试节点 | 内存泄漏检测脚本 |
📌 推荐工作流: 每次性能优化前,先用 perfetto 采集 10 秒基线数据,同时记录 Monsoon 功耗曲线和 dumpsys 内存快照。优化后重复采集,对比四个指标的变化,确保没有负优化。