6、功耗基础与测量:功耗模型(CPU/GPU/ISP/DDR)、功耗测量工具(Power Monitor、BatteryStats)、功耗基线设定
功耗优化这件事,说白了就是跟电池寿命较劲。我做了这么多年相机调优,最怕听到的就是用户说「手机拍十分钟就发烫」。嗯,今天咱们就聊聊功耗的基础——你得先知道电都耗在哪了,才能谈怎么省。
6.1 功耗模型:搞清楚谁在吃电
相机系统里,功耗大户就那么几个:CPU、GPU、ISP、DDR。我习惯把它们比作一个团队——CPU是项目经理,啥杂活都干;GPU是美工,专门处理图像特效;ISP是专业摄影师,负责成像流水线;DDR就是仓库,数据来回搬。
每个模块的功耗特性都不一样。咱们逐个看:
| 模块 | 典型功耗范围 | 主要耗电场景 | 我踩过的坑 |
|---|---|---|---|
| CPU | 200mW ~ 3W | 3A算法、HDR合成、人脸检测 | 曾经有个项目,CPU跑到了2.5W,手机直接降频卡顿 |
| GPU | 100mW ~ 2W | 滤镜渲染、夜景降噪、美颜 | GPU频率没调好,拍一张照片功耗翻倍 |
| ISP | 300mW ~ 1.5W | RAW处理、去马赛克、自动白平衡 | ISP的功耗跟帧率强相关,60fps比30fps多耗40% |
| DDR | 100mW ~ 800mW | 图像数据搬运、多帧缓存 | 带宽跑满时,DDR功耗能占到总功耗的20% |
核心观点:功耗模型不是静态的。同一个ISP,处理1080p和处理4K的功耗差一倍。你得根据实际场景建立动态模型。
6.2 功耗测量工具:别靠猜,要实测
我见过太多工程师靠「感觉」调功耗——「嗯,这个版本应该省电了」。结果一测,功耗反而涨了。所以,工具必须用起来。
6.2.1 Power Monitor:硬件级测量
Power Monitor 是直接串在电池和主板之间的设备。它能测到整机电流,精度到毫安级别。我个人习惯用它做三件事:
- 场景功耗基线:拍一张照片、录一段视频,看整机功耗曲线
- 模块分离:关掉ISP看CPU功耗,关掉GPU看ISP功耗,逐个拆解
- 异常检测:如果某个场景功耗突然跳变,大概率是驱动没睡好
小技巧:用Power Monitor时,记得把屏幕亮度固定。屏幕功耗变化会干扰你的判断。我曾经因为这个浪费了两天时间排查「功耗异常」。
6.2.2 BatteryStats:软件级分析
BatteryStats 是Android自带的工具。虽然精度不如硬件设备,但胜在方便——不用接线,直接跑adb命令就能拿到数据。
# 重置统计
adb shell dumpsys batterystats --reset
# 跑完测试场景后,导出数据
adb shell dumpsys batterystats > battery_stats.txt
# 查看各模块耗电占比
adb shell dumpsys batterystats --checkin
这里要注意:BatteryStats 的数据是估算值,不是精确测量。我一般用它做「趋势分析」——看优化前后功耗是升了还是降了,而不是纠结具体数值。
6.3 功耗基线设定:没有基线,就没有优化
你想想看,如果你不知道「正常功耗」是多少,你怎么判断优化有没有效果?所以第一步,先定基线。
我建议按以下步骤来:
- 选场景:取景预览、拍照、录像、HDR、夜景,每个场景单独测
- 定条件:固定亮度、固定帧率、固定分辨率、固定温度(25°C左右)
- 跑数据:每个场景跑3次,取平均值。如果某次数据偏差超过10%,重跑
- 记录基线:把数据写进文档,作为后续优化的参照
警告:基线不是一成不变的。换了新驱动、升级了系统、改了算法,基线都要重新测。我曾经吃过这个亏——拿着半年前的基线数据做对比,结果发现基线本身已经变了。
6.4 知识体系:一张图看懂功耗优化
下面这张图是我自己整理的功耗优化框架。每次做新项目,我都会先对照这张图,看看哪个环节还没覆盖到。
6.5 实战经验:一次功耗优化的完整流程
我记得有个项目,预览功耗一直偏高。我按上面的流程走了一遍:
- 建模:发现ISP在预览时跑到了600mW,占了整机功耗的40%
- 测量:用Power Monitor确认,ISP确实没睡——即使画面静止,它也在全速跑
- 基线:定下目标——预览功耗从1.2W降到0.8W
- 优化:加了帧率自适应逻辑,静止场景降到15fps,ISP功耗直接砍半
最终结果:预览功耗降到了0.75W,比基线还低。嗯,这就是方法论的力量。
最后说一句:功耗优化不是一锤子买卖。每次改代码、换硬件、升系统,都要重新走一遍这个流程。养成习惯,你的产品就不会「烫手」。
公众号:蓝海资料掘金营,微信deep3321