当前位置: 首页 > news >正文

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至关重要,我们的目标就是打造优秀的相机使用体验,如系统相机软件,以及三方软件使用相机接口,调用系统相机等使用场景都需要尽可能覆盖到。

此外需要提一下的是,功耗优化有些相似之处,有些方向是可以借鉴的,这篇文章就先这样,作为一个引子进行记录。

http://www.dtcms.com/a/347586.html

相关文章:

  • 智能系统与未来生态演进初步思考
  • 告别图片背景违和!autohue.js 让图片与背景自动 “无缝衔接”
  • 基于51单片机自动智能浇花系统设计
  • 【序列晋升】13 Spring Cloud Bus微服务架构中的消息总线
  • 研究生方向:在传统赛道与交叉领域间寻找破局之路
  • 第三阶段数据库-2:数据库中的sql语句
  • 重审文字的本体论地位:符号学转向、解构主义突围与视觉性革命
  • 1电吉他环境搭建:效果器再探
  • C++算法题—— 小C的细菌(二维偏序离线 + 树状数组 + 坐标压缩)
  • [激光原理与应用-328]:结构设计 - Solidworks - 什么是结构建模?
  • PCB电路设计学习3 电路原理图设计 元件PCB封装设计与添加
  • 学习嵌入式第三十六天
  • 神经网络|(十三)概率论基础知识-贝叶斯公式和全概率公式
  • More Effective C++ 条款04:非必要不提供默认构造函数
  • c++string
  • 【计算机网络 | 第8篇】编码与调制
  • 青少年机器人技术(二级)等级考试试卷-实操题(2024年9月)
  • 笔试——Day47
  • 张老师---个人师资介绍
  • python学习DAY49打卡
  • 智慧矿山误报率↓83%!陌讯多模态融合算法在矿用设备监控的落地优化
  • 鸿蒙中CPU活动分析:CPU分析
  • 周末总结(2024/08/23)
  • 数组拆分求最大不重复数和(动态规划解法)
  • Linux内核进程管理子系统有什么第三十三回 —— 进程主结构详解(29)
  • java猜数字游戏(赌城主题版)
  • 注意力机制:捕获长距离依赖关系的革命性技术
  • mysqlbinlog解析命令
  • 订单号老是撞车?我写了个通用 PHP ID 生成器
  • linux添加新硬盘挂载分区和数据迁移