相机启动时间调试指北

简介

相机启动速度是ROM开发中性能优化的重要一环,测试人员经常与对比机对比各个场景下的启动速度,我们可以从以下方面关注相机启动时间,跟对比机比较,看项目慢在哪个环节,本文虽基于Qcom CamX架构,基本步骤是相同的:

分解相机启动的步骤:

  • 从Touch屏幕到CameraManager中准备open camera
  • 打开相机
  • 创建CaptureSession
  • 启动预览

 

分解

下面介绍各个步骤,分解统计耗时,性能分析常用的工具是systrace,可以看到具体线程的工作状态,systrace的基本使用可以参考文章Systrace 简介。
高通CamX Hal层的trace可以通过下面方式打开:

adb shell setprop persist.vendor.camera.traceGroupsEnable 0xFFFFFFFF
adb shell "echo 1 > d/tracing/events/camera/enable"
adb shell "echo 1 > /sys/kernel/debug/tracing/options/record-tgid"

 

从Touch屏幕到CameraManager中准备open camera

从systrace中可以看到system_server进程的tag iq代表Inbound queue,相机启动时间调试指北_第1张图片


当有touch事件时,iq会有变化,以此为起点,到cameraserver进程的connecDevice tag出现,这段耗时可以说是App启动activity的时间,如果时间比较长,App需要分析原因。

打开相机

App调用CameraManager.openCamera打开具体的cameraId,此步骤主要检查cameraId是否可以使用、没有冲突,一般不耗时。

相机启动时间调试指北_第2张图片

 

创建CaptureSession

创建CaptureSession对应APP中调用CameraDevice.createCaptureSession,Camera HAL调用configure_streams来让Sensor power up,初始化Usecase、ChiNode,比较耗时,对于HAL层来说需要重点关注Usecase、ChiNode的初始化时间,避免创建不必要的Usecase和node。如下图:
相机启动时间调试指北_第3张图片


图中红色框1、2明显耗时长,需要check是否合理,3中可以看出创建了许多node,需要check是否必要的。

 

启动预览

App层通过调用CameraCaptureSession.setRepeatingRequest来启动预览,此时底层需要去让Sensor StreamOn,一般到第一帧数据流出需要一点时间,比较耗时。在systrace中可以参考cameraserver进程tag: 第一个Request查看submitRequestList/dequeueBuffer,第一个Result查看cameraserver的processCaptureResult/queueBuffer,中间的间隔是第一帧出帧时间相机启动时间调试指北_第4张图片

注意事项

  1. 测试中可以关闭Log来确认是否Log打印太多导致性能问题:
    adb shell stop logd
    adb shell stop logcat
    logVerboseMask=0x00000
    logInfoMask=0x00000
    traceGroupsEnable=0x00000
    logEntryExitMask=0x00000
    systemLogEnable=FALSE
    adb shell "echo 0x0> /sys/module/cam_debug_util/parameters/debug_mdl"
  2. 系统预定义了Perflock,需要检查是否生效,各个CPU的频率、是否限频可以通过下图示意位置查看,同时可以查看对应thread是否运行在大核上:

相机启动时间调试指北_第5张图片

 

点击对应CPU的Clock Frequency条,在左下角可以看到当前CPU的频率是多少。

3. 相机打开各个步骤间衔接是否紧密,比较常见的是openCamera后到创建CaptureSession这段间隔通常可能比较长,这需要App优化。

相机启动时间调试指北_第6张图片

 

相机启动时间调试指北_第7张图片 东哥笔迹

 

你可能感兴趣的:(Camera)