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条)

  1. Stream on/off时序:检查是否有多余的delay。我见过有人stream off后等了100ms才关clock,其实10ms就够了。
  2. Clock gating:所有不用的clock是否都gate掉了?特别是ISP内部的sub-block clock。
  3. DMA传输粒度:是否用了最小burst size?过大的burst会导致总线长时间被占用,增加仲裁功耗。
  4. Buffer复用:预览和拍照的buffer能否复用?避免频繁申请释放。
  5. IRQ频率:检查vsync中断频率是否过高。30fps的预览,中断频率就是30Hz,没必要更高。
  6. Power rail动态调整:不同场景下是否动态调整了电压?比如低帧率时降低DVDD。
  7. Sensor mode切换:从高分辨率切到低分辨率时,是否先进入standby再切?直接切可能造成电流尖峰。
  8. OTP读取时机:OTP只在开机时读一次,不要每次打开相机都读。
  9. EEPROM/Flash电源:读取完成后是否立即断电?很多驱动忘了这步。
  10. 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划算多了。

功耗优化Checklist 30条体系 硬件层 (8条) 驱动层 (10条) 框架层 (7条) 应用层 (5条) Sensor供电 · MCLK · IO电压 LDO · 纹波 · MIPI电压 Standby电流 · VCM驱动 Stream时序 · Clock gating DMA粒度 · Buffer复用 IRQ频率 · Power rail Mode切换 · OTP · GPIO Open/close · Pipeline ZSL buffer · Metadata Session复用 · Callback Power hint传递 SurfaceView vs Texture UI刷新 · Lifecycle 缩略图 · 传感器管理 ⚠ 常见遗漏点:Thermal反弹 · Sensor干扰 · USB异常 · 低电量模式 阶段一:架构设计 阶段二:驱动开发 阶段三:集成测试
公众号:蓝海资料掘金营,微信 deep3321