【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 的设置—短信界面为例:

其中我们能够看到四种颜色,分别是:蓝色、绿色、淡红色和红色
其中颜色标识所代表的含义如下:(其中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方法花费的时长来进行一个优化和比较验证。
首先看到的是存在过度绘制的一个登录页面,可以看到红色区域占据了很大一部分

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

然后我们通过获取多次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
【Android端 APP GPU过度绘制】GPU过度绘制及优化的更多相关文章
- 【Android端 APP 内存分析】使用工具进行APP的内存分析
Android端可以通过adb 命令直接获取内存信息,当然Android studio也提供了对内存的监控分析工具,并且后续可以结合MAT做分析 今天介绍的是通过Android studio和MAT工 ...
- 【Android端APP 安装包检查】安装包检查具体内容及实现方法
一.安装包检查的具体包含内容有哪些? 1.安装包检查的一般内容包括: 安装包基本信息检查: 文件大小: xx MB 包名: com.xx 名称: xx 本次安装包证书与外网证书对比一致性:是 版本号 ...
- 【Android端 APP 启动时长获取】启动时长获取方案及具体实施
一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分 ...
- C#服务端通过Socket推送数据到Android端App中
需求: 描述:实时在客户端上获取到哪些款需要补货. 要求: 后台需要使用c#,并且哪些需要补货的逻辑写在公司框架内,客户端采用PDA(即Android客户端 版本4.4) . 用户打开了补货通知页面时 ...
- 剖析虚幻渲染体系(12)- 移动端专题Part 2(GPU架构和机制)
目录 12.4 移动渲染技术要点 12.4.1 Tile-based (Deferred) Rendering 12.4.2 Hierarchical Tiling 12.4.3 Early-Z 12 ...
- 将报表移动端集成到自有移动端app方法【IOS、Android】
应用场景 用户有自己的app,希望把报表的移动端[本文中以FineReport移动端为例]功能集成到他们的app里面去,而不需要安装两个app.Android端和IOS端的集成接口是不一样的,下面我们 ...
- 微信app支付(android端+java后台)
本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧 ...
- 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)
使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等) 前言 移动端页面调试一直是好多朋友头疼的问题,iOS 由于其封闭的特性和整体较高的性能,整体适配相对好做,调试 ...
- 移动端App开发 - 02 - iPhone/iPad/Android UI尺寸规范
移动端app开发 - iPhone/iPad/Android UI尺寸规范 本笔记抛去无用的前期分析什么的,全是干货,简洁干练 本笔记不单独针对 ios 或者 Android,两种都介绍,当然我们实际 ...
随机推荐
- iOS 在tableView上添加button导致按钮没有点击效果和不能滑动的 zhuang
转载请注明出处. 今天在调试代码的时候,在tableviewcell上添加button,发现button快速点击的话,是看不出点击效果的,查找资料发现, ios7上UITableViewCell子层容 ...
- 【原创】【2015最新】微信公众平台开发手把手入门之一:缘起微信公众号(PHP,MYSQL, BAE)
最近因为业务的需要,老板布置做了两个月简单的的微信公众平台开发,从网上搜了一些资料,实话说资料不多. 在参考学习的过程中也遇到了不少难缠的小问题,虽然不难逾越,但是确实浪费了时间. 我发现网上仅有不多 ...
- 细说IIS异常日志 — 你必须知道的功能
最近在跟QAD用Webservice搞接口做数据维护,搞的哥那个叫头大,遇到很多问题,系统的log4net根本就无法记录.话说QAD调我某一个接口,可能包含几百个字段,而且QAD是个产品,所以我这边提 ...
- struts2原理理解
1. 由容器创建HttpServletRequest请求,这个请求经过一系列的过滤器,最终到struts2的核心过滤器(FilterDispatch), 2. 核心过滤器会根据url请求获得Act ...
- oracle DBlink 【转】
. 实现结果:在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库,从此数据库中的一个用户下取数,然后插入当前的数据库中的一个表中. 二. 实现方法步骤: 1. 创建 ...
- bonext.js学习笔记
bonext.js是个什么鬼? 首先这是一个前端开发框架,建立在Backbone.js的基础上,使用Jquery操作Dom,Bootstrap负责布局,Art-Template渲染模板,再加上自定义一 ...
- VS2013不显示最近打开文件
首先点击开始在左下角输入"regedit" 右击HKEY_CURRENT_USER,点击查找,输入NoRecentDocsHistory 在右边找到NoRecentDocsHist ...
- C++ 编译报错
vs编译错误描绘如下: 1>f:\company\newphone\softphoneservice\softphoneservice\EventS.h(13): error C2143: 语法 ...
- C语言指针变量作为函数参数
0x01 指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中. 0x02 简单的例子:虽然都能实现功能,但意义不同. 正确的写法: #include <stdio.h> vo ...
- RabbitMQ学习: 介绍
1. 介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非 ...