相机拍照性能依赖算法处理的速度,而处理速度依赖算法的复杂度,算法复杂度越高,处理时间就越长。目前系统相机开发有两种相机拍照方案,分别是相机分段式拍照和相机单段式拍照。
拍照实现方式 | 耗时(不同设备和场景有区别,数据仅供参考) |
|---|---|
单段式拍照 | 1900ms |
分段式拍照 | 672.7ms |
执行拍照任务和图片资源生成的日志和Trace关键字如下,可以根据两者之间的时间来确认耗时。
关键流程 | hilog日志关键字 | Trace关键字 |
|---|---|---|
调用photoOutput类的capture方法 | Capture is called | PhotoOutputNapi::Capture或HStreamCapture::Capture |
执行photoAvailable回调函数 | PhotoListener::OnBufferAvailable | PhotoListener::OnBufferAvailable |
在日志中搜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中搜索PhotoOutputNapi::Capture或HStreamCapture::Capture、PhotoListener::OnBufferAvailable,查看两者间时间间隔,通过拍照耗时来确定拍照方式。
从下图可以看出,单段式拍照方式耗时达到了3.3s。

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

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

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