【Android端 APP GPU过度绘制】GPU过度绘制及优化

时间:2023-03-08 16:36:21
【Android端 APP GPU过度绘制】GPU过度绘制及优化

一、Android端的卡顿

Android端APP在具体使用的过程中容易出现卡顿的情况,比如查看页面时出现一顿一顿的感受,切换tab之后响应很慢,或者具体滑动操作的时候也很慢。

二、卡顿的原因

卡顿的原因可能有很多种,比如:

1、CPU过高

2、内存溢出

3、主线程处理IO操作等

其中过度绘制,是一个容易被忽视但也最好修改并且能够看到效果的内容,其中Android官网给出的过度绘制相关内容见:https://developer.android.com/topic/performance/rendering/overdraw.html

三、什么是过度绘制

1、过度绘制的概念 及如何确定是否是过度绘制?

过度绘制就是在绘制界面时,对同一个像素重复绘制了多次,但是用户能够看到的也只有最顶层绘制的内容。

Android端显示原理的简介见:http://djt.qq.com/article/view/987

显示原理用一句话描述就是:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制后的Surface渲染到显示屏幕上。

名词解释

SurfaceFlinger:Android系统服务,负责管理Android系统的帧缓冲区,即显示屏幕。

Surface:Android应用的每个窗口对应一个画布(Canvas),即Surface,可以理解为Android应用程序的一个窗口。

如果测量、布局和绘制的时间过长,都会导致显示的时间过长,显示以及刷新的时候,都会容易出现丢帧的情况,从而导致卡顿的发生。

通过Android端的开发者设置-调试GPU过度绘制,选择显示过度绘制区域,就能够看到如下图所示内容:

以小米4 的设置—短信界面为例:

【Android端 APP GPU过度绘制】GPU过度绘制及优化

其中我们能够看到四种颜色,分别是:蓝色、绿色、淡红色和红色

其中颜色标识所代表的含义如下:(其中1x代表依次过度绘制,即红色已经是5次及5次以上绘制了)

(1)蓝色1x过度绘制

(2)绿色2x过度绘制

(3)淡红色3x过度绘制

(4)红色4x过度绘制(4次及以上)

App的验收标准:

(1)控制过度绘制为2x

(2)非强制GPU的情况下,无红色区域,即无4x过度绘制情况

(3)浅红色区域总面积不超过屏幕的1/4大小

2 、如何进行优化?

一般出现过度绘制的可能原因是:

(1)无用的背景图片

(2)层级太深

(3)无用的父节点、子节点

(4)没有使用9patch图片

...

下面看我自己写的一个登录程序的例子,来看绘制的时候,oncreate方法花费的时长来进行一个优化和比较验证。

首先看到的是存在过度绘制的一个登录页面,可以看到红色区域占据了很大一部分

【Android端 APP GPU过度绘制】GPU过度绘制及优化

首先,我们通过把无用的背景色全部删除掉,之后将无用的节点删除,比如一个LinearLayout的父节点下面就只有一个Button的属性,这样就没必要有LinearLayout的这个节点了,删除就可以了,因为这里面没有用到图片,后面再通过.9图片和非.9图片的效果验证进行对比。

无过度绘制的登录界面的截图如下:

【Android端 APP GPU过度绘制】GPU过度绘制及优化

然后我们通过获取多次onCcreate的时长,来进行平均时长的验证(每次都会杀进程,一共获取10次,不包含第一次装包):

这是有过度绘制的安装包的onCreate的时长:

01-03 18:33:36.375 16700-16700/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:33:36.475 16700-16700/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:33:51.415 17067-17067/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:33:51.495 17067-17067/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:34:05.415 17416-17416/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:34:05.515 17416-17416/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:34:15.615 17689-17689/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:34:15.715 17689-17689/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:34:24.335 18011-18011/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:34:24.425 18011-18011/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:34:34.855 18297-18297/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:34:35.005 18297-18297/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:34:58.075 18821-18821/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:34:58.215 18821-18821/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:35:07.635 19100-19100/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:35:07.765 19100-19100/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:35:54.535 19385-19385/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:35:54.635 19385-19385/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:36:03.775 19675-19675/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:36:03.905 19675-19675/com.example.a58.testapplication D/onCreate: endCreate

汇总:ms为单位

100、80、100、100、90、150、140、130、100、130

之后是替换成无过度绘制的安装包的onCreate的时长:

01-03 18:42:49.445 24469-24469/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:42:49.525 24469-24469/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:42:57.185 24720-24720/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:42:57.305 24720-24720/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:43:07.075 24987-24987/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:43:07.185 24987-24987/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:44:26.615 26384-26384/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:44:26.715 26384-26384/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:44:34.475 26634-26634/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:44:34.575 26634-26634/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:45:03.965 27023-27023/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:45:04.065 27023-27023/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:46:04.285 28059-28059/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:46:04.375 28059-28059/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:46:43.925 28540-28540/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:46:44.045 28540-28540/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:47:03.865 28907-28907/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:47:03.975 28907-28907/com.example.a58.testapplication D/onCreate: endCreate

01-03 18:47:24.755 29303-29303/com.example.a58.testapplication D/onCreate: startCreate

01-03 18:47:24.855 29303-29303/com.example.a58.testapplication D/onCreate: endCreate

汇总:ms为单位

80、120、110、100、100、100、90、120、110、100

通过以上数据比较可以看出,整体平均值是有减少,幅度将近10%,最长时长明显减少了30ms