zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    JDBC 查询的三大参数 setFetchSize prepareStatement(String sql, int resultSetType, int resultSetConcur)
    有空必看
    SpringMVC 利用AbstractRoutingDataSource实现动态数据源切换
    FusionCharts JavaScript API Column 3D Chart
    FusionCharts JavaScript API
    FusionCharts JavaScript API
    Extjs 继承Ext.Component自定义组件
    eclipse 彻底修改复制后的项目名称
    spring 转换器和格式化
    Eclipse快速生成一个JavaBean类的方法
  • 原文地址:https://www.cnblogs.com/keke-xiaoxiami/p/6218148.html
Copyright © 2011-2022 走看看