系列文章请扫关注公众号!
Android Display Graphics系列文章-汇总
本文主要包括部分:
1、连续冷启动退出多款应用以后卡顿
2、VSYNC设定异常导致卡顿
本文主要两个典型案例,分析System显示整体行为,逐步分析问题根因,通过图文详解各个关键分析点。
1、连续冷启动退出多款应用以后卡顿
遇到此类问题首先需要根据 System显示整体行为分析 一节进行梳理,
1,首先根据标题这个场景是在不停进退app,那么首先就要明确发生问题的trace段,
2,应用的进入和退出参与的图层主要就是应用的activity和launcher,通常都是其中之一有异常帧
3,此题根据我们的梳理,问题出现在Launcher,比较明显的是如下图中红色框中的这一帧
根据以上梳理,我们将问题具体化为: waiting for HWC release 3155 为什么做了那么久?
1,根据 BufferQueue 章节的介绍,可以知道:
这是红框的drawFrame Buffer#1 dequeueBuffer触发的,说明是前一个用#1 Buffer的frame(浅蓝框)还没放掉Layer Fence
2,接着根据 Display Common Trace Tag 一节的介绍
浅蓝这一帧的处理见图中标示,应该是到浅蓝圈layer_fence_rel的位置,#1才被present出去(就是config到driver,显示在了LCM上)
3,按照理解,在新的一帧Buffer没有Ready,还没有Config到driver之前,当前帧会一直被显示,它所使用的Buffer不能内更改或释放
它应该在下一帧(深蓝帧)被config下来的位置signal Layer Fence
4,但可以发现深蓝帧没有拿Launcher的Buffer (BufferTx未减少),表示这个Layer没有被更新,所以浅蓝帧的Layer Fence需要被继续使用
5,所以直到深蓝帧的下一帧绿色帧config下来,才release浅蓝帧的Layer Fence
此处涉及到的概念和对各个Fence Tag的理解比较多,不理解的话需要仔细阅读前面的章节,才能清楚地做出判断
通过这里的分析我们已经可以知道 waiting for HWC release 3155 变长的原因是因为Launcher里有一帧SF没有更新Buffer
所以现在问题变成为什么深蓝这帧没有更新Launcher?
1,根据Latch signaled buffer一节,可以发现:
深蓝帧的SF中出现了fence_unsignaled,表示这一帧的Launcher的Buffer GPU draw还没有完成,所以这帧SF无法使用这个Buffer,见第一张图的黄色竖线
2,那么这一帧没有及时画完是因为GPU draw没有完成纯粹是因为GPU本身慢还是有其他因素影响呢?
第一张图仔细观察黄色线前面一帧#1 dequeueBuffer的wait for hwc release也有被拉长挤到了后面一帧的wait for hwc release
因此需要继续回溯前一个 #1 的wait for hwc release 3151为什么被拉长
=========================================================================
============================完整文章见公众号===============================
=========================================================================