25. 低功耗模式设计:极致省电模式、低功耗预览模式、低功耗拍照模式
说到相机功耗,很多同学第一反应就是「把帧率降下来」。嗯,这个思路没错,但太粗糙了。我这些年调过的项目里,真正能把功耗压到极致又不影响用户体验的,靠的是分场景、分模式、分策略的精细化设计。
今天我们就来聊聊三种低功耗模式:极致省电模式、低功耗预览模式、低功耗拍照模式。这三种模式各有各的适用场景,也各有各的坑。
核心思路:相机功耗优化不是一刀切地降帧率,而是根据用户当前的操作意图,动态调整硬件模块的工作状态。说白了,就是「该省的时候省,该用的时候用」。
25.1 极致省电模式
这个模式一般用在系统电量极低(比如低于5%)或者后台相机的场景。用户可能只是扫个码、拍个文档,对画质要求不高,但希望相机别把最后一点电吃光。
我个人习惯把极致省电模式拆成三个层面:
- Sensor 层面:强制使用 binning 模式,输出分辨率降到 VGA 甚至更低。同时关闭 HDR、多帧合成等重计算功能。
- ISP 层面:关闭所有后处理算法,只保留最基本的 demosaic 和 gamma 校正。降噪、锐化、色彩增强全部 bypass。
- CPU/GPU 层面:把 camera HAL 的线程优先级降到最低,避免抢占系统资源。同时关闭所有预览回调,只保留最基础的帧输出。
我曾经在一个低端项目上遇到过一个问题:极致省电模式下,预览画面卡得跟幻灯片一样,但功耗反而没降多少。查了半天发现是 sensor 的 binning 模式没生效,实际还在输出全分辨率,只是上层做了缩略图。嗯,这个坑大家要注意——一定要确认底层硬件确实工作在低功耗状态,不能只看上层表现。
小技巧:在极致省电模式下,可以主动降低 sensor 的模拟增益和数字增益,让 sensor 工作在更低的供电电压下。虽然画面会暗一些,但功耗能再降 10%-15%。
25.2 低功耗预览模式
这个模式是日常使用中最常见的。用户打开相机取景,但并没有在拍照或录像。这时候我们的目标是:让预览看起来流畅,但背后尽量少干活。
我建议的做法是:
- 帧率动态调节:根据场景复杂度动态调整预览帧率。静止场景降到 15fps,运动场景升到 24fps。不要固定 30fps 跑满。
- 降低预览分辨率:预览输出用 720p 甚至 480p 就够了,没必要跟拍照分辨率一样。用户看的是取景框,不是数毛。
- 关闭不必要的 sensor 模式:如果 sensor 支持多路输出,预览用一路低分辨率流,拍照用另一路高分辨率流。这样拍照时不用切换模式,省掉 mode switch 的功耗。
你想想看,预览的时候用户其实只是在「看」,并没有在「拍」。那我们为什么要让 ISP 全速运转?把那些拍照才需要的算法(比如多帧降噪、超分辨率)全部关掉,预览只走一个轻量级的 pipeline。
注意:低功耗预览模式下,要小心 AE/AWB 的收敛速度。因为帧率降低了,AE/AWB 的更新频率也会变慢。如果用户突然从暗处走到亮处,画面可能会闪烁好几秒。我建议在低功耗预览模式下,仍然保持 AE/AWB 的快速收敛,但降低其他模块的功耗。
25.3 低功耗拍照模式
这个模式比较特殊。用户按下了快门,但又不希望像普通拍照那样消耗大量功耗。典型场景是:文档扫描、二维码识别、连续抓拍。
低功耗拍照模式的核心策略是:
- 单帧拍照:关闭多帧合成,只拍一帧。画质可能差一点,但功耗只有普通拍照的 1/3 到 1/5。
- 降低 JPEG 质量:把 JPEG 压缩质量从 95% 降到 75%。文件小了,编码功耗也小了。
- 关闭后处理:不跑任何算法,直接从 sensor 拿 raw 数据,经过简单的 ISP 处理后输出 JPEG。
我记得有一次做扫码优化,客户要求扫码功耗不能超过 200mW。普通拍照模式动辄 500mW+,根本不可能。后来我们用了低功耗拍照模式:sensor 用 binning 模式输出 640x480,ISP 只做最基本的处理,CPU 只跑一个轻量级的二维码解码库。最终功耗压到了 180mW,完美达标。
关键点:低功耗拍照模式不是「阉割版」的拍照,而是「精准匹配场景」的拍照。你要清楚用户在这个场景下真正需要什么——是画质?是速度?还是省电?然后针对性地裁剪功能。
25.4 三种模式的切换策略
光有模式还不够,关键是怎么切换。我见过不少项目,模式定义得很漂亮,但切换逻辑写得一塌糊涂。结果用户从预览切到拍照时,功耗反而飙升了一下。
我建议的切换策略是:
| 当前模式 | 目标模式 | 切换策略 |
|---|---|---|
| 极致省电 | 低功耗预览 | 先恢复 sensor 到正常 binning 模式,再逐步开启 ISP 算法。不要一次性全开,避免电流尖峰。 |
| 低功耗预览 | 低功耗拍照 | 保持 sensor 当前模式,只切换 ISP pipeline 到拍照模式。如果 sensor 支持多路输出,直接复用预览流。 |
| 低功耗预览 | 普通拍照 | 先切换 sensor 到全分辨率模式,同时预热 ISP 算法。等 sensor 稳定后再触发拍照。 |
这里有个细节:切换过程中要避免「乒乓效应」。比如用户快速切换场景,导致模式来回跳。我一般会加一个 500ms 的去抖延时,确保模式切换是稳定的。
25.5 整体架构图
下面这张图展示了三种低功耗模式在相机系统中的位置和关系:
25.6 避坑指南
最后,我把自己踩过的坑总结一下,希望能帮大家少走弯路:
- 不要只看 sensor 功耗:我曾经以为 sensor 是功耗大头,结果发现 ISP 和 DDR 带宽才是真正的电老虎。优化 sensor 的同时,一定要关注 ISP pipeline 和内存访问。
- 模式切换要平滑:用户从低功耗预览切到普通拍照时,如果画面突然闪一下或者卡一下,体验会很差。我建议在切换前先预加载目标模式的配置,等一切就绪后再切换。
- 别忘了测试边界条件:比如在极致省电模式下,用户突然按快门拍照。这时候系统应该怎么做?是忽略拍照请求,还是先切到低功耗拍照模式再拍?这些边界逻辑一定要想清楚。
- 功耗数据要实测:不要只看理论计算。我遇到过 sensor 的 binning 模式在规格书上写的是 50mW,实际测出来 80mW。所以一定要用电流计实测,以实测数据为准。
我的习惯:每次调完一个低功耗模式,我都会在三个场景下做功耗测试:亮环境、暗环境、快速切换场景。这三个场景基本能覆盖 90% 的用户使用情况。
好了,关于低功耗模式设计就聊到这里。这三种模式不是孤立的,它们需要配合系统的功耗管理策略一起工作。实际项目中,你可能还需要考虑 thermal 限制、电池老化等因素。但核心思路不变:精准匹配场景,动态调整策略,该省则省,该用则用。