Android Display性能问题教战手册4-典型案例分析

server/2024/9/23 15:51:47/

系列文章请扫关注公众号!

Android Display Graphics系列文章-汇总

本文主要包括部分:

1、连续冷启动退出多款应用以后卡顿

2、VSYNC设定异常导致卡顿

本文主要两个典型案例,分析System显示整体行为逐步分析问题根因,通过图文详解各个关键分析点。

1、连续冷启动退出多款应用以后卡顿

遇到此类问题首先需要根据 System显示整体行为分析  一节进行梳理,

1,首先根据标题这个场景是在不停进退app,那么首先就要明确发生问题的trace段,

2,应用的进入和退出参与的图层主要就是应用的activitylauncher,通常都是其中之一有异常帧

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 dequeueBufferwait for hwc release也有被拉长挤到了后面一帧的wait for hwc release

 

因此需要继续回溯前一个 #1 的wait for hwc release 3151为什么被拉长

=========================================================================

============================完整文章见公众号===============================

=========================================================================


http://www.ppmy.cn/server/120860.html

相关文章

Jenkins Pipeline 中通过勾选参数来控制是否构建 Docker 镜像

1.定义参数: 使用 booleanParam 定义一个布尔参数,示例如下 booleanParam(name: BUILD_DOCKER, description: 是否构建Docker镜像, defaultValue: false)2.使用参数: 在 stage 中,根据参数的值决定构建方式: stage(编…

【医疗大数据】基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析

基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析 1、引言 1-1 医疗大数据的特点 10 V模型:在医疗领域,大数据的特点被描述为10 V,包括价值(Value)、体量(Volume)、速度&#xf…

使用云服务器构建langchin

我是用autodl对langchin进行构建,使用ssh服务实例化。

C++速通LeetCode中等第1题-字母异位词分组

思路要点&#xff1a;对字符串排序&#xff0c;排序结果存放在map的key中&#xff0c;排序结果相同的字符串存放到map的value中 。 class Solution { public:string keys;vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vecto…

Android通知服务及相关概念

本文基于Android 14源码 1 NotificationManagerService的启动 1.1 添加服务 和其他系统服务一样&#xff0c;NotificationManagerService也是在SystemServer中启动的。 //framework/base/services/java/com/android/server/SystemServer.java private void run() {t.traceB…

Matplotlib在运维开发中的应用

在现代运维开发中,数据可视化扮演着越来越重要的角色。它能帮助我们更直观地理解系统状态,快速发现潜在问题,并辅助决策制定。Python的Matplotlib库作为一个强大而灵活的绘图工具,在运维领域有着广泛的应用。本文将探讨Matplotlib在运维开发中的常见应用场景,并提供实用的代码示…

vue无感刷新Token并重新请求

vue 拦截器拦截401重新请求Token 无感刷新Token 之后重新请求报401的接口 instance.interceptors.response.use(async (response) > {let { data } response;if (data.code 401 || data.code 403) {return await handleExpiredToken(response.config);}if (data.code ! …

js笔记(第二章)

Number 在js中所有的数值都是Number类型&#xff0c;包括整数和浮点数(小数) js中可以表示最大值 console.log(Number.MAX_VALUE) 输出结果中&#xff0c;最大的后边的7e308是科学计数法&#xff0c;表示e后边有308位 如果想要更大的值…