Android UI性能优化

2021-03-02  本文已影响0人  duoduo7628

屏幕渲染机制

过程很简单,执行起来却很难,因为这里有两个问题,撕裂卡顿,为什么?

那你就会有个疑问了

这是因为"现代计算机之父"冯·诺依曼提出了计算机的体系结构: 计算机由运算器,存储器,控制器,输入设备和输出设备构成,每部分各司其职。

那能不能让cpu停下来?
当然可以,但是不划算,因为这样就等于把cpu的长处给扼杀了。

等等,有个问题,你说当两个图像重合的的问题叫作撕裂,那不是从第二帧开始,时时刻刻都在撕裂?

为什么是16ms?

fps是啥玩意儿?这里说两个概念

怎么解决呢?Vsync 和 双缓冲

双缓冲+Vsync

牛~~,双缓冲+Vsync解决了撕裂问题,但是并没有解决卡顿的问题,当cpu收到Vsync信号后,如果cpu还没有计算完,也肯定就不会交换前后缓冲的数据,也就是说,屏幕再次读取的还是前缓冲的数据,也就是两次显示了一样的画面,也就是产生了卡顿。
是的,卡顿问题是解决不了的,只能优化。

还能怎么优化?三缓冲 !
首先要清楚下,Android屏幕绘制流程。

  1. 任何一个View都是依附于window的
  2. 一个window对应一个surface
  3. view的measure、layout、draw等均是计算数据,这些是cpu干的事
  4. cpu把这些事干好后,在经过一系列计算将数据转交给gpu
  5. gpu将数据栅格化后,就交给SurfeceFlinger(以下简称SF)
  6. SF将多个surfece数据合并处理后,就放入后缓冲区
  7. 屏幕以固定频率从前缓冲区拿出数据渲染,渲染完毕后发送VSYNC,此时前后缓冲区数据交换,屏幕绘制下一帧。

上述7步是建立在开启硬件加速的情况下的,如果没有硬件加速,就去掉gpu部分,就可以简单理解为cpu直接将数据转交给sf,我们简单整理一下数据的传递流程:
「cpu -> gpu -> display」,而且我们看到,cpu和gpu是排队工作的,它俩和屏幕是并行工作的。好,我们来看发生卡顿(jank)的场景

双缓冲卡顿场景

我们来看引入三缓冲后的效果:


三缓冲使用效果

源码层面看cpu做了哪些事
请看这篇文章,View的加载流程
从这里我们可以看出,View加载过程中,使用到的耗时操作

解决IO操作和Xml解析
如果在可以的情况下,不推荐使用Xml来写布局,推荐使用代码直接new。但是这样一来可维护性大大降低。
借用此思想,github上也有一个由掌阅发布的开源库:https://github.com/iReaderAndroid/X2C

RecyclerView优化
RecyclerView一些你可能需要知道的优化技术
参考:
Android 性能优化必知必会
性能优化系列总篇
Android性能优化
一篇小短文,带你了解屏幕刷新背后的故事
Android UI性能优化实战 识别绘制中的性能问题
Android UI性能优化 检测应用中的UI卡顿
Google 发布 Android 性能优化典范
Android性能优化

上一篇 下一篇

猜你喜欢

热点阅读