Camera 功耗优化

Camera功耗排查全攻略 | 建议收藏备用

 Camera功耗问题在项目后期几乎是必查项。预览功耗高、拍照功耗超标、后台待机掉电快……这篇问题把高通平台功耗排查的全链路思路整理出来,希望对大家日常排查问题有帮助,建议收藏,备用。 

一、功耗排查前置准备

在开始Camera侧排查之前,先和BSP功耗团队一起做整机的功耗拆解:


  1. 测量整机功耗
     — 用功耗拆解板分别测量Sensor、CPU、CX、DDR、Panel各模块的功耗

  2. 确认FPS达标
     — 和性能团队确认FPS是否达标,不达标时CPU调度策略会拉高频率

  3. 检查GPU/MDP时钟
     — 和Display/Graphics团队确认GPU/MDP时钟是否合理

  4. 准备Driver Only版本
     — 用纯驱动版本(不含CHI定制)对标基线功耗

确认是Camera侧问题后,进入下面的Camera专项检查清单。

二、Camera侧排查清单

2.1 日志负载检查

很多人不知道,Camera HAL的日志本身会消耗可观的CPU功耗。先量化日志的影响:

# 测量10秒的日志文件大小
adb logcat -v time > log_10s.txt
# 检查文件大小,超过500KB说明日志量过大

# 关闭多余日志
# camxsettings.xml中设置:
overrideLogLevels=0x00
systemLogEnable=FALSE

# 对比关闭日志前后的功耗
adb shell stop logd
# 测量功耗电流,对比差异

⚠️ 注意:overrideLogLevelssystemLogEnable只能控制Camx核心日志。CHI Node的日志需要单独在CHI代码里关闭,别漏了。 

2.2 Stream和Buffer检查

多余的Stream和过大的Buffer是功耗杀手:

# 开启内存统计
logInfoMask=32
enableMemoryStats=TRUE

# 运行memprofile脚本分析Buffer
python get_memory_stats.py preview preview camera_log.txt

检查重点:


  • Stream数量
     — App是否申请了不必要的Stream

  • Buffer格式
     — 是否使用了UBWC压缩格式(直接影响DDR带宽和功耗)

  • max_buffers
     — Buffer池大小是否合理

  • usage参数
     — Stream的usage flag是否正确

2.3 3A负载检查

3A算法(AEC/AWB/AF)的统计信息处理会消耗CPU。如果怀疑3A负载高:

# 临时关闭各统计处理,测量功耗变化
# camxsettings.xml:
DisableAWBStatsProcessing=TRUE
disableAFStatsProcessing=TRUE
disablePDAF=TRUE

# 逐个关闭后测量功耗差异
# 可定位是哪个3A模块在吃功耗

三、CPU指令级分析

3.1 Systrace分析

# 开启Systrace相关配置
traceGroupsEnable=0x10080
systemLogEnable=FALSE
overrideLogLevels=0x00

# 抓取systrace
# 在Systrace中检查Camera HAL线程的运行时间
# 理想状态:Camera HAL任务只在Node Process中运行且有trace tag

如果发现长时间运行但没有trace tag的任务,说明有异常行为——可能是某个线程在做不该做的事。

3.2 Simpleperf指令采样

simpleperf精确统计CPU指令数,这是定位热点函数的关键:

# 获取camera provider的PID
adb shell ps -e | grep camera.provider

# 统计指令数(10秒采样)
adb shell "/system/bin/simpleperf stat -p <PID> -o /data/misc/perf_stat.txt --duration 10 -e instructions"
adb pull /data/misc/perf_stat.txt

# 函数级性能分析
adb shell "/system/bin/simpleperf record -p <PID> -g -e instructions -o /data/misc/perf.data --duration 10 -c 1000000"
adb shell "/system/bin/simpleperf report -i /data/misc/perf.data > /data/misc/report.txt"
adb shell "/system/bin/simpleperf report -i /data/misc/perf.data -g --full-callgraph > /data/misc/report_callgraph.txt"
adb pull /data/misc/report.txt
adb pull /data/misc/report_callgraph.txt

3.3 生成火焰图

# 克隆FlameGraph工具
git clone https://github.com/brendangregg/FlameGraph.git

# 转换perf.data为火焰图
python report_sample.py perf.data > out.perf
FlameGraph/stackcollapse-perf.pl out.perf > out.folded
FlameGraph/flamegraph.pl out.folded > flame.svg

# 在浏览器打开flame.svg

火焰图能直观展示CPU时间花在哪了。把客户设备的火焰图和基线对比,热点函数一目了然。

3.4 Page Fault分析

Page Fault过多通常意味着频繁的map/unmap/alloc操作:

# 采样page-fault事件
adb shell "/system/bin/simpleperf record -p <PID> -g -e page-faults -o /data/misc/perf.data --duration 10"

# 分析page-fault调用栈
# 如果采样数异常高,用火焰图定位是哪个函数在做频繁内存映射

四、Sensor驱动与Pipeline检查

4.1 Sensor分辨率与驱动配置

Sensor XML中的以下参数直接影响IFE时钟和功耗:

参数
影响
framerate
直接影响IFE时钟频率
lineLengthPixelClock
行像素时钟,影响IFE时钟选择
frameLengthLines
帧长行数,影响FPS和功耗
outputPixelClock
输出像素时钟,配置错误会导致PHY/CSID错误
minHorizontalBlanking / minVerticalBlanking
消隐区间,影响数据传输模式

4.2 Pipeline设计审查

客户定制的Pipeline设计是功耗异常的常见原因:


  • 去掉不必要的HW Node
     — 比如Snapshot流不需要的HW Node会增加额外功耗

  • 先用默认Pipeline测基线
     — 在排查定制Pipeline之前,先用高通推荐的默认Pipeline/usecase测一遍

  • 逐个移除CHI Node
     — SAT/EIS/美颜等CHI Node,逐个移除来拆解功耗

  • 检查EIS Frame Delay
     — Frame Delay和EIS Margin可以适当减小来降低功耗

  • 检查OIS采样率
     — 采样率过高会带来大量中断和CPU负载

4.3 时钟频率Dump

# Dump所有Camera子设备的时钟
adb shell "find /d/clk/cam_cc* -iname clk_measure -exec grep -ni '^[1-9]' /dev/null {} \;" | more

# 对照DTSI检查时钟级别是否合理

4.4 功耗日志检查

# 开启Power相关日志
# CamxLogGroupPower对应的Mask值
# 可以查看IFE/IPE Node的Clock/BW计算过程
# 确认BW/Clock投票是否合理

# 在日志中搜索Power相关日志
grep -i "power\|clock\|bandwidth\|bw" camera_log.txt

五、功耗排查速查表

排查方向
工具/方法
关键指标
日志负载
adb logcat测文件大小
10秒日志 > 500KB = 过高
Buffer/Stream
memprofile脚本
多余Stream、非UBWC格式
CPU负载
simpleperf + 火焰图
指令数、热点函数
Page Fault
simpleperf -e page-faults
采样数过高 = 频繁映射
Sensor配置
Sensor XML检查
framerate、outputPixelClock
Pipeline设计
默认Pipeline对比
多余HW Node、CHI Node负载
时钟频率
clk_measure dump
对照DTSI确认级别

六、实战建议

💡 功耗排查黄金法则


  1. 先测基线,再查差异
     — 用默认配置测出基线功耗,再逐步加定制内容看增量

  2. 日志是第一功耗杀手
     — 排查功耗前先关日志,可能省掉10-20%的CPU负载

  3. UBWC格式是免费午餐
     — 所有YUV Buffer都应该用UBWC,直接降低DDR带宽

  4. CHI Node逐个拆
     — SAT/EIS/美颜每个都是功耗大户,逐个移除测量

  5. 对比基线火焰图
     — 和参考设备的火焰图对比,热点差异一目了然

— END —

 觉得有帮助?点个「在看」转发给同事吧 👇 

更多Camera开发实战内容

欢迎加入知识星球「小驰成长圈」

120+ Camera工程师 · 340+ 实战内容 · 已运营1565天

小驰成长圈 知识星球

微信扫码 · 加入星球

欢迎扫码关注「小驰行动派」公众号 10 年Camera开发 | Camera技术干货 | 行业洞察 | Camera实战分享
小驰行动派公众号 扫一扫关注
分享到: 复制链接
← 上一篇 高通 Camx debug 日志打印控制 下一篇 → MTK Camera性能优化:冷启动全链路八阶段分析与优化实战

相关文章

推荐课程

想系统学习 Camera 开发?看看这些课程

评论 (0)

暂无评论,快来抢沙发吧