28. 功耗优化 checklist:30条必检功耗优化项、常见遗漏点
做相机功耗优化这么多年,我踩过的坑比走过的路还多。说实话,很多问题翻来覆去就是那几类。今天我把压箱底的30条必检项整理出来,每条都是真金白银换来的经验。
你想想看,一个项目到了收尾阶段,功耗数据还差那么一截。这时候最怕什么?最怕漏掉某个不起眼的点。我习惯在项目初期就建立一份checklist,每完成一个阶段就过一遍。嗯,这招帮我省了不少返工的麻烦。
核心原则:功耗优化不是最后才做的事。从架构设计阶段就要开始考虑,贯穿整个开发周期。
一、硬件层必检项(8条)
| 序号 | 检查项 | 说明 | 优先级 |
|---|---|---|---|
| 1 | Sensor供电电压 | 确认是否使用了最低可用电压,而非默认最高值 | P0 |
| 2 | MCLK频率 | 检查是否高于实际需求,通常24MHz足够 | P0 |
| 3 | IO电压域匹配 | Sensor与AP的IO电压是否一致,避免电平转换损耗 | P0 |
| 4 | LDO使能控制 | 不使用的LDO是否已关闭,而非仅拉低使能 | P1 |
| 5 | DVDD/AVDD纹波 | 纹波过大会导致Sensor内部PLL额外耗电 | P1 |
| 6 | MIPI D-PHY电压 | 确认是否可降至1.2V(部分平台支持1.0V) | P1 |
| 7 | Sensor standby电流 | 实测standby模式电流,对比datasheet标称值 | P2 |
| 8 | AF/VCM驱动功耗 | 检查VCM驱动IC是否在非对焦时进入低功耗模式 | P2 |
我曾经在一个项目里,发现Sensor的DVDD被设成了1.8V,但datasheet上写的是1.2V就能工作。改过来之后,整机功耗直接降了15mA。你说这冤枉不冤枉?
二、驱动层必检项(10条)
- Stream on/off时序:检查是否有多余的delay。我见过有人stream off后等了100ms才关clock,其实10ms就够了。
- Clock gating:所有不用的clock是否都gate掉了?特别是ISP内部的sub-block clock。
- DMA传输粒度:是否用了最小burst size?过大的burst会导致总线长时间被占用,增加仲裁功耗。
- Buffer复用:预览和拍照的buffer能否复用?避免频繁申请释放。
- IRQ频率:检查vsync中断频率是否过高。30fps的预览,中断频率就是30Hz,没必要更高。
- Power rail动态调整:不同场景下是否动态调整了电压?比如低帧率时降低DVDD。
- Sensor mode切换:从高分辨率切到低分辨率时,是否先进入standby再切?直接切可能造成电流尖峰。
- OTP读取时机:OTP只在开机时读一次,不要每次打开相机都读。
- EEPROM/Flash电源:读取完成后是否立即断电?很多驱动忘了这步。
- GPIO状态:不用的GPIO是否设为输入+内部下拉?悬空的GPIO会漏电。
我的习惯:每次写完驱动,我都会用示波器抓一遍所有power rail的上电时序。别嫌麻烦,这一步能发现90%的硬件功耗问题。
三、框架层必检项(7条)
- Camera open/close流程:检查是否有资源泄漏。我遇到过session close后,某个buffer一直没释放,导致DDR无法进入自刷新。
- Preview pipeline:是否有多余的processing node?比如你不需要人脸检测,但框架默认开了,这就是白花花的功耗。
- ZSL buffer管理:ZSL模式下buffer数量是否合理?太多浪费内存,太少导致频繁申请。
- Metadata更新频率:不必要的metadata更新会触发hal层重新计算,增加CPU负载。
- Session复用:切换前后摄时,能否复用同一个session?避免重复创建销毁。
- Callback频率:检查onFrameAvailable等回调是否过于频繁。回调本身就有开销。
- Power hint传递:框架是否正确传递了场景信息给底层?比如低光场景应该降帧率。
说白了,框架层的优化往往被忽视。大家总觉得底层驱动才是大头,其实框架层不合理的设计,能让底层所有优化都白费。
四、应用层必检项(5条)
| 序号 | 检查项 | 常见问题 |
|---|---|---|
| 1 | SurfaceView vs TextureView | TextureView需要GPU合成,功耗更高。能用SurfaceView就别用TextureView |
| 2 | UI刷新频率 | 取景界面是否有不必要的动画?比如实时滤镜预览,每帧都重绘UI |
| 3 | Camera lifecycle | Activity切到后台时是否及时release camera?很多人只pause没release |
| 4 | 缩略图生成 | 拍照后生成缩略图是否用了异步?同步生成会阻塞UI线程 |
| 5 | Location/Gyro等传感器 | 拍照时是否关闭了不用的传感器?比如拍完照还开着陀螺仪 |
五、常见遗漏点(特别提醒)
这部分是我最想说的。很多团队做完上面那些检查,觉得差不多了。但下面这几个点,十有八九会被漏掉。
遗漏点1:Thermal throttling后的功耗反弹
我曾经遇到一个案子,温控触发后降频了,但温度降下来后,频率恢复得太激进,导致功耗反而比降频前还高。检查一下你的thermal governor策略,恢复曲线要平滑。
遗漏点2:多摄场景下的Sensor间干扰
双摄同时工作时,两个Sensor的MCLK可能产生串扰,导致PLL失锁,功耗飙升。我建议在layout阶段就注意clock走线隔离,软件上可以错开MCLK相位。
遗漏点3:USB插入时的功耗异常
插着USB调试时,很多功耗优化会被绕过。比如充电IC会强制拉高某些电压域。记得在USB拔出状态下做最终功耗验收。
遗漏点4:低电量模式下的行为
电池电压低时,boost电路效率会下降。如果你的相机在低电量时功耗反而更高,那就要检查一下power management IC的配置了。
六、我的checklist使用建议
这份清单不是让你一次性全做完。我建议分三个阶段来用:
- 第一阶段(架构设计):重点看硬件层的8条和框架层的7条。这时候改起来成本最低。
- 第二阶段(驱动开发):重点过驱动层的10条。每条都要实测验证。
- 第三阶段(集成测试):过一遍应用层的5条,再加上那4个遗漏点。
嗯,最后说一句。功耗优化没有银弹,但有了这份checklist,至少你不会在同一个地方跌倒两次。我每次带新人,第一件事就是让他们把这份清单背下来。你想想看,30条而已,比踩坑后加班改bug划算多了。