[sg] imx6q Android6.0 1080p的界面恢复时卡顿问题排查

问题描述:

环境:Android 6.0 imx6q 内存2G
现象:系统分辨率设置为1080p时首次打开App(以Setting为例)的时间比从recent恢复还要短,从recent恢复能感觉到明显的卡顿感觉,点击后会在launcher明显等待后才会恢复activity
对比:Android 6.0下 720p该现象不存在;Android 4.4 1080p该现象不存在

问题排查:(以Setting为排查对象)

使用traceview抓取Android 6.0下720和1080环境下从recent恢复Activity时的方法耗时进行对比

以Activity.onResume方法结束执行作为开始,直到Activity.onWindowFocusChanged作为结束比较整个绘制过程的时间
1.首先是draw方法,1080p比720p慢55ms左右,但是这里我们可以理解,毕竟更高的分辨率意味着更大的资源文件和图形渲染

720p
1080p

/
2. 剩下两个方法
720p

[sg] imx6q Android6.0 1080p的界面恢复时卡顿问题排查_第1张图片
这里写图片描述
可以看出方法本身不怎么耗时,但是(Context Switch)309次,耗时36ms
[sg] imx6q Android6.0 1080p的界面恢复时卡顿问题排查_第2张图片
这里写图片描述

1080p

[sg] imx6q Android6.0 1080p的界面恢复时卡顿问题排查_第3张图片
这里写图片描述
(Context Switch)次数590,耗时444ms
[sg] imx6q Android6.0 1080p的界面恢复时卡顿问题排查_第4张图片
这里写图片描述

结论

这两个方法从名字上看,一个是在渲染线程进行初始化,另一个是native的内存分配,在720p耗时总计38ms,在1080p时直接变成了600ms,多了足足560ms,根据方法整体的执行时间图判断,基本可以认定是这两个方法的耗时过长导致了1080p时的卡顿

在我关闭SettingsActivity的硬件加速flag后,发现从recent恢复时卡顿问题消失(当然缺点是该页面的动画效果失去硬件加速后没有之前流畅了),问题初步解决

至于为什么1080p时硬件加速的这两个相关方法会导致该问题,因为我手上暂时没有其他方案的cpu,只能做出一个简答猜测,相关问题我已经从fae反馈给了原厂看能否得到支持。
硬件加速本身是将一些浮点运算从CPU交给更擅长做浮点运算的GPU来做,我们可以从上述图片中看到这两个方法真正耗时急剧增加的是(Context Switch),也就是上下文切换,上下文切换耗时增加的大概率原因是线程过多导致的,5.0新增加硬件加速Api经过了解确实存在大量的渲染线程操作,所以这里不负责任猜测,耗时增加的原因是在1080p条件下,硬件加速所需渲染的任务数相比720急剧增加,线程数量的上升以及imx6本身性能限制导致的线程切换消耗大幅增加的结果。(原厂如果有反馈我会及时更新)

你可能感兴趣的:(android,framework)