背景
CB7手机Camera的ARSticker模式,切换资源、预览、拍视频比AB7手机慢与卡。需要分析原因。并拆分性能瓶颈点。
手机信息
手机代号 | CPU 版本 | GPU 版本 |
---|---|---|
AB7 | MT6765V 4xCortex-A53 2.3Ghz 4xCortex-A53 1.8Ghz | IMG GE8320 680Mhz |
CB7 | MT6761V 4xCortex-A53 2.0Ghz | IMG GE8320 660Mhz |
通过CPU和GPU的对比,CPU相差很大,GPU相差不大,切换资源和预览卡,都是和GPU相关的,应该不会有很大的差别。
systrace分析预览卡顿


具体耗时:

从上面的图,可以看出,性能点不在GPU,CB7和AB7 GPU画图,相差不大。
真正的差异:
- 关键点检测(Contending for pthread mutex)等锁。
- 频繁的触发GC.
关于第1点,CB7手机 cpu的性能确实差好多,第2点,CB7手机内存是3GB的,AB7是6GB的,也是差了好多。现在最重要的问题是,这两点哪个对此性能影响最大?
确定2点的影响率
对比测试,找了一台X625B的手机,内存是3GB,MT6762平台,GPU和61平台的差不多,CPU是8核的。systrace如下:


从上图看:只有CPU的差异的时候,onDrawFrame快一倍,一个平均70ms,一个平均30ms.说明这个性能瓶颈就是和CPU正相关的。在仔细看GC的触发频率,3G内存的平台是一样的,都是500ms一次,这是GC的正常触发机制。可以排除内存不是此性能瓶颈的因素,CPU就是此性能的关键因素。
初步解决方案
CPU的性能瓶颈是硬伤,可以通过优化算法提升速度,主要的算法是关键点检测,但是这个比较难,需要第三方优化。我们想到方案是缩小用于检测yuv数据,可以提升速度,理论依据:
- yuv数据量小,相机吐数据的速度快。
- yuv数据量小,用于检测关键点检索次数也小,速度会快。
目前测试640x480的yuv数据传给第三方,发现三方引擎会卡死,三方目前表示不支持。正在push三方支持。
切换资源慢
由于切换ARSticker资源是应用自己调用的接口,没有添加Trace.beginSection和Trace.endSection,所以systrace是没有相关信息的。看了代码如果添加trace,和加log的效果一样,所以确定加log分析。
把加载资源分解如下:
- 从Asset中读取资源文件,可以体现IO性能。
- 三方解释资源接口。
- 资源上传GPU.
Log如下:
01-02 21:14:33.878 23623 24931 E CamAp_ARMode: azmohan start load
01-02 21:14:33.878 23623 24931 I CamAp_ARMode: azmohan read Assets io begin
01-02 21:14:33.923 23623 24931 E CamAp_ARMode: azmohan read data size = 1778464
01-02 21:14:33.923 23623 24931 E CamAp_ARMode: azmohan read Assets io end, spent time : 45 ms
01-02 21:14:33.923 23623 24931 I CamAp_ARMode: azmohan invoke fuCreateItemFromPackage begin
01-02 21:14:36.239 23623 24931 I CamAp_ARMode: azmohan invoke fuCreateItemFromPackage end,spent time : 2300 ms
01-02 21:14:36.271 23623 24931 E CamAp_ARMode: azmohan notify GPU load resource,mEffectItem = 1
01-02 21:14:36.271 23623 24931 E CamAp_ARMode: azmohan end load,spent time : 2345 ms
01-02 21:14:36.275 23623 23648 I CamAp_ARMode: azmohan GPU load resource begin
01-02 21:14:36.275 23623 23648 I CamAp_ARMode: azmohan GPU load resource end,spent time : 0 ms
主要是第三方接口 faceunity.fuCreateItemFromPackage(itemData)太耗时,需要2.3s,要push三方解决。
cpu性能
我们这边测试enablePlugin,设置false,可以节省30%的CPU,测试drawFrame平均耗时40ms,比70ms有很大提升,并且接近30帧(33ms)的要求。
总结
主要性能瓶颈在cpu,目前解决方案:
- 关掉enablePlugin,可以提升cpu性能,已验证。但是就没有了美颜效果。
- 传入较小的yuv数据用于关键点检测,三方还要调整接口,未验证。
网友评论