美文网首页
Android性能优化-UI优化

Android性能优化-UI优化

作者: 沉淀者 | 来源:发表于2020-11-11 21:15 被阅读0次

    一、Android渲染机制

    大家在开发应用的时候或多或少都遇到过可感知的界面卡顿现象,尤其是在布局层次嵌套太多,存在不必要的绘制,或者onDraw方法中执行了过多耗时操作、动画执行的次数过多等情况下,很容易造成此类情况。如今APP设计都要求界面美观、拥有更多的动画、图片等时尚元素从而打造良好的用户体验。但是大量复杂的渲染工作很可能造成Android系统压力过大,无法及时完成渲染工作。那么多久执行一次渲染,才能让界面流畅运行呢?

    image

    如上图所示,Android系统每隔16ms就会发送一个VSYNC信号(VSYNC:vertical synchronization 垂直同步,帧同步),触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的正常帧率:60fps。一旦这时候系统正在做大于16ms的耗时操作,系统就会无法响应VSYNC信号,执行渲染工作,导致发生丢帧现象。

    image

    例如上图所示:如果你的某个操作花费时间是24ms,系统在得到VSYNC信号的时候就无法进行正常渲染,只能等待下一个VSYNC信号(第二个16ms)才能执行渲染工作。那么用户在32ms内看到的会是同一帧画面。

    用户容易在UI执行动画、ListView、RecyclerView滑动的时候感知到界面的卡顿与不流畅现象。所以开发者一定要注意在设计布局时不要嵌套太多层,多使用 include方法引入布局。同时不要让动画执行次数太多,导致CPU或者GPU负载过重

    看到这里同学可能会疑问:为什么是16ms渲染一次,和60fps有什么关系呢?下面让我们看一下原理:

    16ms意味着着1000/60hz,相当于60fps。

    那么只要解释为什么是60fps,这个问题就迎刃而解:

    这是因为人眼和大脑之间的写作无法感知超过60fps的画面更新,12fps大概类似手动快速翻动书籍的帧率,这是明显可以感知到不够顺滑的。
    24fps使得人眼感知的是连续的线性运动,这其实是归功于运动模糊效果,24fps是电影胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。
    但是低于30fps是
    无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,当然超过60fps是没有必要的

    二、引起界面卡顿的原因

    2.1 界面卡顿的主要元凶—— 过度绘制(Overdraw)
    1 什么是过度绘制?

    过渡绘制是指屏幕上某个像素在同一帧的时间内绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制操作,这就会导致某些像素区域被绘制了多次,这就是很大程度上浪费了CPU和GPU资源。最最常见的过度绘制,就是设置了无用的背景颜色!!!

    2 如何发现过度绘制?

    对于Overdraw这个问题还是很容易发现的,我们可以通过以下步骤打开显示GPU过度绘制(Show GPU Overrdraw)选项

    设置 -> 开发者选项 -> 调试GPU过度绘制 -> 显示GPU过度绘制

    打开以后之后,你会发现屏幕上有各种颜色,此时你可以切换到需要检测的程序与界面,对于各个色块的含义,请看下图:

    image

    蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,
    蓝色: 意味着overdraw 1倍。像素绘制了两次。大片的蓝色还是可以接受的(若整个窗口是蓝色的,可以摆脱一层)。
    绿色: 意味着overdraw 2倍。像素绘制了三次。中等大小的绿色区域是可以接受的但你应该尝试优化、减少它们。
    淡红: 意味着overdraw 3倍。像素绘制了四次,小范围可以接受。
    深红: 意味着overdraw 4倍。像素绘制了五次或者更多。这是错误的,要修复它们。
    我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。

    3 解决问题的工具和方法

    1.通过Hierarchy Viewer去检测渲染效率,查看具体哪个控件的哪个步骤花费的时间较长,从而进行优化。
    2.通过开发者过度绘制去检测过度绘制,最终可以通过移除不必要的背景。

    三、使用布局标签优化布局

    1.<include>布局复用
    2.<merge>减少布局嵌套
    3.<viewstub>减少初次绘制

    四、优化常用工具

    1. Systrace
    2. Profile GPU rendering
    3. Lint
    4. Layout InspectorHierarchy Viewer

    参考:https://www.jianshu.com/p/906cd1af2ce7

    相关文章

      网友评论

          本文标题:Android性能优化-UI优化

          本文链接:https://www.haomeiwen.com/subject/rnuybktx.html