文档章节

应用UI卡顿原理以及优化

猪菜
 猪菜
发布于 2017/08/17 15:18
字数 1090
阅读 6
收藏 0

人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这种流畅的帧率规定为60fps。

有了上面的背景,我们开发App的帧率性能目标就是保持在60fps,也就是说我们在进行App性能优化时心中要有如下准则:

换算关系:60帧/秒-----------16ms/帧;

准则:尽量保证每次在16ms内处理完所有的CPU与GPU计算、绘制、渲染等操作,否则会造成丢帧卡顿问题。

当然了,针对Android系统的设计我们还需要知道另一个常识;虚拟机在执行GC垃圾回收操作时所有线程(包括UI线程)都需要暂停,当GC垃圾回收完成之后所有线程才能够继续执行(这个细节下面小节会有详细介绍)。也就是说当在16ms内进行渲染等操作时如果刚好遇上大量GC操作则会导致渲染时间明显不足,也就从而导致了丢帧卡顿问题。

有了上面这两个简单的理论基础之后我们下面就会探讨一些UI卡顿的原因分析及解决方案。

应用UI卡顿常见原因

1.1我们在使用App时会发现有些界面启动卡顿、动画不流畅、列表等滑动时也会卡顿,究其原因,很多都是丢帧导致的;通过上面卡顿原理的简单说明我们从应用开发的角度往回推理可以得出常见卡顿原因,如下:

  1. 人为在UI线程中做轻微耗时操作,导致UI线程卡顿;

  2. 布局Layout过于复杂,无法在16ms内完成渲染;

  3. 同一时间动画执行的次数过多,导致CPU或GPU负载过重;

  4. View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或GPU负载过重;

  5. View频繁的触发measure、layout,导致measure、layout累计耗时过多及整个View频繁的重新渲染;

  6. 内存频繁触发GC过多(同一帧中频繁创建内存),导致暂时阻塞渲染操作;

  7. 冗余资源及逻辑等导致加载和执行缓慢;

  8. 臭名昭著的ANR;

可以看见,上面这些导致卡顿的原因都是我们平时开发中非常常见的。有些人可能会觉得自己的应用用着还蛮OK的,其实那是因为你没进行一些瞬时测试和压力测试,一旦在这种环境下运行你的App你就会发现很多性能问题。

1.2大面积打印GC导致所有线程暂停的操作必定会导致UI视觉的卡顿,所以我们要避免此类问题的出现,具体的常见优化方式如下:

  • 检查代码,尽量避免有些频繁触发的逻辑方法中存在大量对象分配;
  • 尽量避免在多次for循环中频繁分配对象;
  • 避免在自定义View的onDraw()方法中执行复杂的操作及创建对象(譬如Paint的实例化操作不要写在onDraw()方法中等);
  • 对于并发下载等类似逻辑的实现尽量避免多次创建线程对象,而是交给线程池处理。

大面积打印GC导致所有线程暂停的操作必定会导致UI视觉的卡顿,所以我们要避免此类问题的出现,具体的常见优化方式如下:

  • 检查代码,尽量避免有些频繁触发的逻辑方法中存在大量对象分配;
  • 尽量避免在多次for循环中频繁分配对象;
  • 避免在自定义View的onDraw()方法中执行复杂的操作及创建对象(譬如Paint的实例化操作不要写在onDraw()方法中等);
  • 对于并发下载等类似逻辑的实现尽量避免多次创建线程对象,而是交给线程池处理。

本文转载自:http://blog.csdn.net/yanbober

猪菜
粉丝 0
博文 19
码字总数 2717
作品 0
广州
私信 提问
应用卡顿优化

概要 应用运行时的卡顿问题非常影响用户体验,严重降低产品表现力,本文将介绍应用卡顿原因以及分析方法等等。 卡顿问题可分为两类,应用卡顿和系统卡顿,本文针对系统正常时应用卡顿场景。 ...

某昆
2017/09/30
0
0
Android UI性能优化 检测应用中的UI卡顿

本文已在我的公众号hongyangAndroid首发。 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/58626355 本文出自张鸿洋的博客 一、概述 在做app性能优化的时候,大家都希...

lmj623565791
2017/03/01
0
0
Android自定义View——从零开始实现书籍翻页效果(性能优化篇)

版权声明:本文为博主原创文章,未经博主允许不得转载。 系列教程:Android开发之从零开始系列 源码:github.com/AnliaLee/BookPage,欢迎star 大家要是看到有错误的地方或者有啥好的建议,欢...

Anlia
2017/11/03
0
0
iOS 面试全方位剖析 -- UI视图篇(二)

UITableView相关 事件传递&视图响应 图像显示原理 卡顿&掉帧 绘制原理&异步绘制 离屏渲染 面试问题总结 图像显示原理 具体的看一下CPU和GPU做了哪些事,看下图 } 此时的堆栈...

PetitBread
2018/05/10
0
0
浅谈App的性能优化

写在前面: 说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断...

咖喱配胡椒
2017/12/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
2
0
微服务架构依赖图

基于spring-cloud-alibaba + dubbo

龙影
昨天
5
0
Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
昨天
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
昨天
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部