目录

应用拍照时延长

问题现象

拍照耗时较长,点击拍照等一会儿才会有拍照成功显示。

背景知识

相机拍照性能依赖算法处理的速度,而处理速度依赖算法的复杂度,算法复杂度越高,处理时间就越长。目前系统相机开发有两种相机拍照方案,分别是相机分段式拍照和相机单段式拍照。

问题定位

  1. 首先确认拍照方式是单段式拍照还是分段式拍照,有以下几种方法:
    • hilog日志:

      在日志中搜photoAvailable|photoAssetAvailable来确定,打印photoAvailable表示为单段式拍照,photoAssetAvailable为分段式拍照。

      如无photoAvailable|photoAssetAvailable日志打印,则在日志中搜索PhotoListener::OnBufferAvailable|Capture is called确认拍照耗时,根据拍照耗时来推测拍照方式,如下图中多次拍照耗时在2~3s,根据上述性能耗时对比分析表,属于单段式拍照。

      08-25 10:17:27.790  5277  5278 I C02B00/com.example.myapplication/CAMERA: {OnBufferAvailable()-photo_output_napi.cpp:82} PhotoListener::OnBufferAvailable is called
      08-25 10:17:31.527  5277  5277 I C02B00/com.example.myapplication/CAMERA: {Capture()-photo_output_napi.cpp:1297} Capture is called
      08-25 10:17:34.396  5277  5764 I C02B00/com.example.myapplication/CAMERA: {OnBufferAvailable()-photo_output_napi.cpp:82} PhotoListener::OnBufferAvailable is called
      08-25 10:17:37.741  5277  5277 I C02B00/com.example.myapplication/CAMERA: {Capture()-photo_output_napi.cpp:1297} Capture is called
      08-25 10:17:40.540  5277  5278 I C02B00/com.example.myapplication/CAMERA: {OnBufferAvailable()-photo_output_napi.cpp:82} PhotoListener::OnBufferAvailable is called
      08-25 10:17:43.347  5277  5277 I C02B00/com.example.myapplication/CAMERA: {Capture()-photo_output_napi.cpp:1297} Capture is called
    • 查看代码:

      在代码中搜索photoAvailable和photoAssetAvailable,通过查看代码中监听photoAvailable还是photoAssetAvailable事件来确定。

      // 单段式拍照
      photoOutput.on('photoAvailable', (err: BusinessError, photo: camera.Photo) => {
      // 获取图像数据处理
      });
      
      // 分段式拍照
      photoOutput.on('photoAssetAvailable', (err: BusinessError, photoAsset: photoAccessHelper.PhotoAsset) => {
      // 获取图像数据处理
      });
    • Trace分析:

      在Trace中搜索PhotoOutputNapi::Capture或HStreamCapture::Capture、PhotoListener::OnBufferAvailable,查看两者间时间间隔,通过拍照耗时来确定拍照方式。

      从下图可以看出,单段式拍照方式耗时达到了3.3s。

      分段式拍照方式拍照耗时643ms。

  2. 如果是单段式拍照方式,在拍照过程中通过多帧融合以及多个底层算法处理之后返回一张高质量图片,完成时延比较长,导致拍照慢,可更换成分段式拍照方式。
  3. 如果是分段式拍照方式,拍照慢需要分析耗时集中在哪部分。

    首先使用布局分析工具ArkUI Inspector抓取拍照加载过程的页面布局,确认加载动效使用的是什么组件,如下图中可看到加载动效使用的是LoadingProgress,以及组件ID。

    然后使用Frame分析工具抓取拍照整体阶段的Trace信息,根据PhotoOutputNapi::Capture或HStreamCapture::Capture、PhotoListener::OnBufferAvailable确定应用调用拍照接口到获取图像数据阶段的耗时,根据LoadingProgress组件首次绘制和最后一次绘制的Trace点(H:FrameNode[LoadingProgress][id:组件ID]::RenderTask)来确定应用处理图像数据的耗时。

    从下图中可看到整体耗时2.2s,耗时较多的是应用处理图像数据部分,达到1.6s。

分析结论

拍照耗时长的原因有:

修改建议