Android面试系列文章2018之内存管理之UI卡顿篇

Android面试系列文章2018之内存管理之UI卡顿篇

1.UI卡顿的原理

  60ftp –> 16ms: Android系统每隔16ms都会对界面进行渲染一次,造成卡顿的原因就是Android系统在渲染的时候丢帧了, 16ms = 1000/60hz,相当于60fps(每秒帧率)。这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。12fps大概类似手动快速翻书的帧率,这个速度明显可以感知是不够顺滑的。24fps使得人眼感知的是连续线性运动,24fps是电影胶圈通常使用的帧率,这个帧率可以支撑大部分电影画面需要表达的内容。但是地域30fps是无法顺畅表现绚丽的画面内容,此时需要使用60fps来达到想要的效果。因此,如果应用没有在16ms内完成屏幕刷新的全部逻辑操作,就会发生卡顿。因为Android系统每隔16ms就会发出VSYNC信号,触发对UI进行渲染,VSYNC是Vertical Synchronization(垂直同步)的缩写,可以简单的把它认为是一种定时中断。在Android 4.1中开始引入VSYNC机制。

  过度绘制(overdraw): Overdraw(过度绘制)描述的是屏幕上的某个项目在同一帧内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域内绘制了 多次,这就浪费了大量的CPU以及GPU资源。可以开启调试工具,打开开发者设置来显示GPU过度绘制显示情况。一般步骤:设置-> 开发者选项->调试GPU过度绘制->显示GPU过度绘制 (不同的手机操作路径不一致,但是大体差不多)

深红: 意味着overdraw 4倍。像素绘制了5次或者更多,这是错误的,需要修复;
淡红: 意味着overdraw 3倍。像素绘制了4次,小范围可以接受。
绿色: 意味着overdraw 2倍。像素绘制了3次。中等大小的绿色区域是可以接受的,但是还是应该优化,减少他们。
蓝色: 意味着overdraw 1倍。像素绘制了2次。大片的啦色还是可以接受的。

优化的目标就是减少红色的Overdraw,看到更多的蓝色区域。

2.UI卡顿原因

[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(轻量版)。

3.解决方法

1.布局优化 
  尽量不存在布局冗余嵌套以及过于复杂的布局。如果有重用的布局使用include标签。< merge >标签是作为< include >标签的一种辅助扩展来使用的,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。大家都知道,Android去解析和展示一个布局是需要消耗时间的,布局嵌套的越多,那么解析起来就越耗时,性能也就越差,因此我们在编写布局文件时应该让嵌套的层数越少越好。

http://blog.csdn.net/guolin_blog/article/details/43376527

2.列表及Adapter优化 
  使用View的重用机制。在列表滑动的时候,不要去加载资源,显示默认的资源或者图片的缩略图,在列表滑动结束的时候再加载。

3.背景和图片等内存分配的优化 
  尽量减少一些背景中不必要的设置,背景图片尽量进行压缩处理。

4.避免ANR 
  在主线程(UI线程)不要进行耗时操作。

猜你喜欢

转载自blog.csdn.net/zhangbijun1230/article/details/83788156
今日推荐