概述
相机拍照性能依赖算法处理的速度,而处理效果依赖算法的复杂度,算法复杂度越高的情况下会导致处理时间就越长。目前系统相机开发有两种相机拍照方案,分别是[相机分段式拍照]和[相机单段式拍照]:
- 分段式拍照是系统相机开发的重要功能之一,即相机拍照可输出低质量图用作缩略图,提升用户感知拍照速度,同时使用高质量图保证最后的成图质量达到系统相机的水平,既满足了后处理算法的需求,又不要阻塞前台的拍照速度,构筑相机性能竞争力,提升了用户的体验。
- 单段式拍照是指在拍照过程中通过多帧融合以及多个底层算法处理之后返回一张高质量图片,这样导致Shot2See(Shot2See指的是从用户点击拍照控件到在缩略图显示区域显示缩略图)完成时延比较长。
分段式拍照和单段式拍照返回的图片在全质量图的情况下图片质量是一致的,但是在低质量的情况下单段式拍照的图片质量要优于分段式拍照。如果开发者不需要获取全质量图并且也不考虑Shot2See的完成时延,建议使用单段式拍照,否则的话,建议使用分段式拍照。本篇文章主要以相机Shot2See场景为例,来展示分段式拍照Shot2See的完成时延要低于单段式拍照。
图1 分段式拍照流程示意图
效果展示
图2 单段式拍照效果图
图3 分段式拍照效果图
从上述效果图中可以看出,分段式拍照从用户点击拍照控件到在缩略图显示区域显示缩略图的耗时比单段式拍照要短。
性能对比分析方式
静态校验:在相机类应用中,如果使用单段式拍照,拍照过程中该场景下仅会返回一张图片,将图片用作Shot2See后的缩略图则会导致Shot2See完成时延比较长。
动态校验:开发者可以通过DevEco Studio中的Profiler工具去抓取Trace,获取到Trace之后,根据PhotoOutputNapi::Capture和OnBufferAvailable找到对应的Trace Marker,并通过两者之间的时间段来分析耗时,单段式拍照的时长为1900ms,而分段式拍照的时长为672.7ms。
图4 单段式拍照性能数据图
图5 分段式拍照耗时数据图
性能对比分析表
拍照实现方式 | 耗时(局限不同设备和场景,数据仅供参考) |
---|---|
单段式拍照 | 1900ms |
分段式拍照 | 672.7ms |
优化思路:在需要加快Shot2See完成时延的场景下,使用相机框架开发的分段式拍照方案,加快阶段一照片生成的速度。
场景示例
下面以应用中相机Shot2See(拍照之后自动跳转到照片编辑界面)为例,通过单段式拍照和分段式拍照的性能功耗对比,来展示两者的性能差异。
单段式拍照:
单段式拍照使用了[on(type: ‘photoAvailable’, callback: AsyncCallback): void] 接口注册了高质量图的监听,默认不使能分段式拍照。具体操作步骤如下所示:
1.相机媒体数据写入[XComponent组件]中,用来显示图像效果。具体代码如下所示:
XComponent({
type: XComponentType.SURFACE,
controller: this.mXComponentController,
imageAIOptions:this.options
})
.onLoad(async () => {
Lo