Camera performance analysis
序
这篇文章主要是为了给相机性能分析提供一些学习研究方向,实际开发过程中还是需要多发现,多思考,多总结,才能不断将相机系统越做越精,越做越好!
接下来将会以场景分类,分析方法,优化方向,实战场景进行一一说明,主要涉及理论这块,具体代码实现的话可以根据理论自行实现框架设计。
场景分类
一般与用户直接交互的是相机上层应用,比较直观化,但并不意味着只需要上层优化就行了,这里只是以相机应用作为切入点进行说明。
耗时类:
打开类(启动类):包含冷启动、杀进程冷启动、热启动、反复热启动,休眠启动,以及三方应用调用系统相机启动(三方应用直接调用相机API)等场景。
切换类:包含前后置相机切换、拍照或录像模式之间的切换(其他相机模式)等场景。
拍照类:包含各种模式的拍照,例如常见的闪光灯拍照、HDR拍照、夜景拍照,专业拍照等场景。
这一类问题主要耗时差异是拍照帧的获取和后处理流程的差异。
卡顿类
一般有预览卡顿,拍照卡顿,录像卡顿,对焦,相机控件点击,滑动事件卡顿等。
以上都是实际优化方向的场景,由于篇幅有限不能全部都一一说明,后续会在下文的使用场景中进行举例说明,仅供参考,最终技术选型可根据最终优化效果确定。
分析方法
LOG分析
这个方法需要对系统相机子系统要非常熟悉才行,根据经验快速定位耗时位置,比如什么日志对应什么阶段流程,每个阶段耗时多少,在camera架构每个层次耗时多少,找到耗时最长或较长的时间段,查看可以优化的方向,或者通过分析不同平台,不同的系统版本日志信息来确认优化方向。
Perfetto分析(也可以是Systrace)
Android Perfetto 和 Systrace 都是用于 Android 系统性能分析的工具,Perfetto 是 Systrace 的下一代工具,Perfetto提供强大的分析功能,如 SQL 查询、统计视图、交互式分析等,可以更深入地分析性能数据,并且可以直接通过命令直接抓取
如:
adb shell perfetto -o /data/misc/perfetto-traces/trace.pftrace -t 10s am binder_driver camera dalvik freq gfx hal idle input memory memreclaim res sched sync view webview wm workq binder power
通常也会通过配置文件(config.pbtx)进行更灵活的配置,可以通过 Perfetto网站上进行可视化配置,但配置相对复杂,可根据需求添加对应的配置信息,然后根据提示保存到配置文件,再然后将配置文件移动到设备对应位置
adb push config.pbtx /data/misc/perfetto-configs/config.pbtx
然后通过下面命令执行抓取trace信息文件
adb shell perfetto --txt -c /data/misc/perfetto-configs/config.pbtx -o /data/misc/perfetto-traces/trace.pftrace
拿到的trace.pftrace文件在官网中打开文件进行查看
官方链接如下:
https://ui.perfetto.dev/
相对于Systrace,Perfetto支持长时间跟踪,文件大小可达 GB 级别,获取到有效信息会更高效
以上的说明都是一些perfetto的基本介绍,具体运用这个需要很多年积累经验的过程,无法速成,perfetto本身只是个工具,会用工具几天就学会了,重点是看到里面数据表达的意义。
Perfetto官方文档也比较成熟,可以参考学习,还可以通过相关优秀的博客进行学习,如
https://www.androidperformance.com/2024/03/27/Android-Perfetto-101/#/Perfetto-%E7%B3%BB%E5%88%97%E7%9B%AE%E5%BD%95
还有对应的视频学习,如
https://www.bilibili.com/video/BV1oi82efE4D/?spm_id_from=333.337.search-card.all.click
这些是相对基础的学习,后续学习可以根据实际项目进行积累,还有就是和相关从业者进行交流学习,后续如果有机会,我这边会写一篇较为详细的perfetto的介绍和针对相机性能优化Perfetto实战的文章,现在实在是太忙了,挤不出来时间了。
优化方向
以下提供优化方向的几种思路,可根据项目实际情况进行匹配修改,就如字面意思,还是很好理解的,实际开发过程中学习了解整体相机子系统架构,防止优化引入其他风险,需要提前研判和后续的测试。
异步化
降低图片像素
提帧
迁核
提频
IO优化
内存优化
日志优化
这里需要提一下,这里看起来最简单的,但是很多同学会忽略,不太重视日志等级,也不太注意打印是否会引起性能问题,比如说正常我们输出debug打印,这个可能影响较小,但是如果加入到一个循环里面或者对一个高频调用的方法里面,就一直输出打印,这样对性能肯定是有影响的,还有就是对异常时候的打印与debug打印混用,导致release版本上无法输出日志,无法定位线上问题,这个问题也需要特别注意。
如果是debug版本可以多用debug等级输出日志,对于关键逻辑的话建议使用Info等级记录关键流程,对于异常逻辑打印使用Error等级打印。
去冗优化
减少延时
转硬件处理
使用场景
这边简单举例两个使用场景:
1.如果相机模式切换不设计摄像头id的变化,可以选择直接reconnect,原理就是不再关闭camera设备,只需要关闭session,然后重新配流,启预览,可以大大优化相机预览加载效率。
2.在配流起预览阶段,可以不用等待onConfigured回调之后再进行起预览,因为对于配流,起预预览来说,实际上是同步的,可以通过一个异步线程去配流和起预览,基本上是零延时的,速度会很快,少了其他的一些验证逻辑,并且还有需要主要的是配流成功需要给一个状态值,防止起预览时候配流没有完成的风险。
总结
性能优化在软件设计中具有重要意义,对产品的UE至关重要,我们的目标就是打造优秀的相机使用体验,如系统相机软件,以及三方软件使用相机接口,调用系统相机等使用场景都需要尽可能覆盖到。
此外需要提一下的是,功耗优化有些相似之处,有些方向是可以借鉴的,这篇文章就先这样,作为一个引子进行记录。