背景:使用开发者相机拍照出图需要1.9s。

测试用例:
手机版本:开发者手机Openharmony4.1
测试步骤:
1.打开辅助相机或者高速相机,并对准测试机开始录像
2.相机-点击拍照按钮,拍摄一张照片
3.重复步骤2,总计操作5次
4.将拍摄好的视频传到PC端
5.在PC端打开AVIDEMUX2,点击文件选择上传的拍摄视频,弹出视频后左下角选择帧编号模块
6.手动左右键播放计算起点帧数和终点帧数,通过时延公示算出完成时延
起点帧数:手指离开屏幕第一帧
终点帧数:照片完全生成缩略图为第一帧

原因分析:

1. 分析Systrace,分析耗时比较多阶段

从TP松手,到缩略图显示耗时1.9s,主要耗时集中在底层产图,media数据库取照片耗时;

img

从抓systrace脚本生成进程信息ps文件中,可以找到trace里面进程号对应模块名字。
D:\systrace\trace\20240521\ps\ps_20240521_161321.log
741 camera_host为相机底层产图,出流进程。
741 741 ? 00:00:00 camera_host
741 31647 ? 00:00:00 offlinepipeline
758 为相机框架服务进程
758 758 ? 00:00:00 camera_service
2154 为medialibrarydata图库数据框架进程
2154 2154 ? 00:00:03 edialibrarydata

2. 分析相机获取media缩略图耗时原因

从trace看相机下发图库medialiabrarydata图片大小为1440X1920,实际底层拍照生成图为3072X4096;图片大小由以前的1.5M变成了18M,没有压缩处理;
初步分析可能相机底层修改了相机拍照出图分辨率。

img

3. 确认底层拍照生成图为3072*4096对性能影响。

修改camera_host相机配置文件,恢复到以前1280* 960分辨率。

/vendor/hys/oriole/hdf_config/uhdf/camera/hdi_impl/camera_host_config.hcs
root {
  camera_host_config {
       ability_01 :: ability {
            logicCameraId = "lcam001";
            physicsCameraIds = [
                "CAMERA_FIRST"
            ];
            metadata {
              ...
             -   basicAvailableConfigurations = [3, 1280, 960, 4, 4096, 3072];
             +  basicAvailableConfigurations = [3, 1280, 960, 4, 1280, 960];
              ....
            }
  }
}

编译:
删除camera以前的中间文件:
find ./out -type f -name ".hcb" -exec rm -v {} ;
find ./out -type f -name "
.cfg" -exec rm -v {} ;
编译整个工程:
./build.sh --product-name oriole --ccache --no-prebuilt-sdk
生成镜像刷机重新拍照抓取systrace

img


从trace上可以看出改成原来1k分辨率1280X960后,恢复到正常760ms,和图片相关业务都减少了4倍。

修改方案:

1 先回退到以前1k分辨率1280X960,保证性能正常。
2 4k分辨率4096X3072后,等图片压缩适配性能优化后在上。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐