美文网首页
android性能之卡顿分析解决

android性能之卡顿分析解决

作者: johnnycmj | 来源:发表于2018-01-12 15:33 被阅读375次

    卡顿原因

    过于复杂的布局

    UI渲染的整个过程是由CPU和GPU两个部分协同完成的.CPU负责UI布局元素的Measure, Layout, Draw等相关运算执行. GPU负责栅格化(rasterization), 将UI元素绘制到屏幕上.

    如果我们的UI布局层次太深, 或是自定义控件的onDraw中有复杂运算, CPU的相关运算就可能大于16ms, 导致卡顿.

    这个时候, 我们需要借助Hierarchy Viewer这个工具来帮我们分析布局了. Hierarchy Viewer不仅可以以图形化树状结构的形式展示出UI层级, 还对每个节点给出了三个小圆点, 以指示该元素Measure, Layout, Draw的耗时及性能.

    过度绘制(Overdraw)

    Overdraw: 用来描述一个像素在屏幕上多少次被重绘在一帧上.
    通俗的说: 理想情况下, 每屏每帧上, 每个像素点应该只被绘制一次, 如果有多次绘制, 就是Overdraw, 过度绘制了.

    所谓Overdraw, 就是在一个像素点上绘制了多次. 常见的就是:

    1. 绘制了多重背景.
    2. 绘制了不可见的UI元素.

    Overdraw主要原因是背景的多重绘制, 或是不可见的View在背后绘制等, 但不仅限于此.

    UI线程的复杂运算

    UI线程的复杂运算会造成UI无响应, 当然更多的是造成UI响应停滞, 卡顿。产生ANR已经是卡顿的极致了

    StrictMode的使用

    StrictMode用来基于线程或VM设置一些策略, 一旦检测到策略违例, 控制台将输出一些警告,包含一个trace信息展示你的应用在何处出现问题.

    频繁的GC

    上面说的都是处理上的, CPU, GPU相关的. 实际上内存原因也可能会造成应用不流畅, 卡顿的.

    为什么说频繁的GC会导致卡顿呢?

    简而言之, 就是执行GC操作的时候,任何线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行, 故而如果程序频繁GC, 自然会导致界面卡顿.

    导致频繁GC有两个原因:

    1. 内存抖动(Memory Churn), 即大量的对象被创建又在短时间内马上被释放.
    2. 瞬间产生大量的对象会严重占用Young Generation的内存区域, 当达到阀值, 剩余空间不够的时候, 也会触发GC. 即使每次分配的对象需要占用很少的内存,但是他们叠加在一起会增加Heap的压力, 从而触发更多的GC.

    一般来说瞬间大量产生对象一般是因为我们在代码的循环中new对象, 或是在onDraw中创建对象等. 所以说这些地方是我们尤其需要注意的...

    相关文章

      网友评论

          本文标题:android性能之卡顿分析解决

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