文档章节

【学习笔记】Android性能优化----->布局优化

鬼风
 鬼风
发布于 2016/02/18 18:01
字数 1127
阅读 170
收藏 5

1.AndroidUI渲染机制

人眼所感觉的流畅画面,需要画面的帧数达到40帧每秒到60帧每秒

在Android中,系统通过VSYNC信号触发对UI的渲染/重绘,其间隔时间是16ms,这个16ms其实就是1000ms中

显示60帧画面的单位时间,即1000/60

如果系统每次渲染的时间都保持在16ms之内,那我们看见的UI界面将是非常流畅的

但这也就需要将所有程序的逻辑都保证在16ms之内

如果不能在16ms内完成绘制,那么就会造成丢帧现象,即当前该重绘的帧被未完成的逻辑阻塞

例如一次绘制任务耗时20ms,那么在16ms系统发出VSYNC信号时就无法绘制,该帧就被丢弃,等待下次信号才开始绘制,

导致16*2ms内都显示同一帧画面,这就是画面卡顿的原因


Android系统提供了检测UI渲染时间的工具,打开“开发者选项”,选择“Profile GPU Rendering”,
并选中“On screen as bars”的选项,这时候在屏幕上将显示一些条形图。


每一条柱状线包含三部分:蓝色代表测量绘制Display List的时间,红色代表OpenGL渲染Display List所需要的时间,
黄色代表CPU等待GPU处理的时间。
中间的绿色横线代表VSYNC时间16ms,需要尽量将所有条形图都控制在这条绿色之下。


2.避免Overdraw


Overdraw,过度绘制会浪费很多的CPU/GPU资源

例如系统默认会绘制Activity的背景
而如果再给布局绘制了重叠的背景,那么默认Activity的背景就属于无效的过度绘制-Overdraw.


Android系统在开发者选项中提供了这样一个检测工具-"Enable GPU Overdraw".激活后,可以通过界面上的颜色来判断Overdraw的次数。

尽量增大蓝色区域,减少红色区域。


3.优化布局层级

在Android中,系统对View进行测量/布局和绘制时,都是通过对View数的遍历来进行操作的。

如果一个View树的高度太高,就会严重影响测量/布局和绘制的速度,因此优化布局的第一个方法就是降低View树的高度。


Google在其API文档中建议View树的高度不宜超过10层。


在早期的Android版本中,Google使用LinearLayout作为默认创建的XML文件的根布局。

而现在的版本的Android中,Google已经使用RelativeLayout来替代LinearLayout作为默认的根布局。

其原因就是通过扁平的RelativeLayout来降低通过LinearLayout嵌套所产生布局树的高度,从而提高UI渲染的效率。

实际使用时,如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就采用LinearLayout,因为RelativeLayout布局过程需要花费更多的CPU时间。

如果需要通过嵌套的方式来完成布局,这种情况下还是建议采用RelativeLayout。

因为ViewGroup的嵌套就相当于增加了布局的层级,会降低程序的性能。



4.避免嵌套过多无用布局

嵌套的布局会让View树的高度变得越来越高,


选择不同的Layout组件,从而避免通过某一种Layout组件来实现功能的局限性,从而造成嵌套过多的情况发生。


4.1.使用<include>标签重用Layout


4.2.使用<ViewStub>实现View的延迟加载
<ViewStub>也可以引用并实现延迟加载。

<ViewStub>是一个非常轻量级的组建,它不仅不可视,而且大小为0.

可以通过setVisibility()方法来显示

可以通过ViewStub的inflate()方法来显示这个View

通过inflate()方法可以返回引用的布局,从而可以再通过View.findViewById()方法来找到对应的控件。

代码:


ViewStub mViewStub = (ViewStub)findViewById(R.id.mViewStub);

//                mViewStub.setVisibility(View.VISIBLE);
                View view = mViewStub.inflate();
                TextView tv_stub = (TextView)findViewById(R.id.tv_stub);
                tv_stub.setText("ViewStub");



不管使用哪种方式,一旦<ViewStub>被设置为可见或是inflate了,<ViewStub>就不存在,取而代之的是被inflate的Layout,

并将这个Layout的ID重新设置为<ViewStub>中通过android:inflatedId属性所指定的ID,

这也是为什么两次调用inflate方法会报错的原因。

© 著作权归作者所有

鬼风
粉丝 13
博文 116
码字总数 32745
作品 0
苏州
Android工程师
私信 提问
Android性能优化:这是一份详细的布局优化 指南(含、、)

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的布局优化,希望你们会喜欢。 目录 /** 实例说明:在上述例子,在布局B中 通过标签引用布局C 此时:布局层级为 = RelativeLa...

Carson_Ho
2018/05/14
0
0
Android性能优化之布局优化

最新最准确内容建议直接访问原文:Android性能优化之布局优化 本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge)、去除不必要的嵌套和View节...

Trinea
2013/08/13
287
1
Android性能优化:那些不可忽略的绘制优化

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的绘制优化,希望你们会喜欢。 目录 // 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除 优化方案2:移除 控件...

Carson_Ho
2018/05/21
0
0
使用layoutopt进行布局优化

创建好看的Android布局是个不小的挑战,当你花了数小时调整好它们适应多种设备后,你通常不想再重新调整,但笨重的嵌套布局效率往往非常低下,幸运的是,在Android SDK中有一个工具可以帮助你...

小克898
2013/03/16
0
0
Android布局优化的要点

通过inflate在Activity中布局是个有性能消耗的过程。每增加一个嵌套的布局和视图都会对应用的性能造成很大的影响。 总之,好的实践是尽量保持布局尽可能简单,尤其是要避免嵌套inflate操作整...

无鸯
2011/09/07
649
2

没有更多内容

加载失败,请刷新页面

加载更多

我为什么要写微信公众号

埋一颗种子,细心呵护,静待她枝繁叶茂,葱郁参天 V2论坛上有个帖子【做程序员最重要的还是一定要有自己的作品】,作者写道: 能有一个作品和你的名字联系在一起,应当成为在职业生涯前期着意...

运维咖啡吧
25分钟前
2
0
数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
5
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
6
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部