布局渲染优化

[toc]
动脑学院视频笔记:

GPU与CPU的区别

image.png

黄色的 Control 为控制器,用于协调控制整个 CPU 的运行,包括取出指令、控制其他模块的运行等; 绿色的 ALU ( Arithmetic Logic Unit )是算术逻辑单元,用于进行数学、逻辑运算;
橙色的 Cache 和 DRAM 分别为缓存和 RAM ,用于存储信息。
从结构图可以看出, CPU 的控制器较为复杂,而 ALU 数量较少。因此 CPU 擅长各种复杂 的逻辑运算,但不擅长数学尤其是浮点运算。

XML文件到屏幕显示的过程

image.png
image.png

卡顿原理分析

Android 系统每隔 16ms 发出 VSYNC 信号 (1000ms/60=16.66ms) ,触发对 UI 进行渲染, 如果每次渲染都成 功这样就能够达到流畅的画面所需要的 60fps ,为了能够实现 60fps ,这意味着计算渲染的大多数操作都必须 在 16ms 内完成。

image.png

16 毫秒的时间主要被两件事情所占用
第一件:将 UI 对象转换为一系列多边形和纹理
第二件: CPU 传递处理数据到 GPU 。
所以很明显,我们要缩短 这两部分的时间,也就是说需要尽量减少对象转换的次数,以及上 传数据的次数

如何减少这两部分的时间 以至于在 16ms 完成呢
  • CPU 减少 xml 转换成对象的时间
  • GPU 减少重复绘制的时间

过度绘制

GPU绘制的过程,就像刷墙一样,一层层的进行,16ms刷一次。这样就会造成,图层覆盖的现象,即无用的图层还会被绘制在底层,造成不必要的浪费。

过度绘制几种情况
  • 自定义控件中onDraw方法做了过多重复绘制
  • 布局层次太深,重叠性太强,用户看不到的区域GPU也会渲染,导致耗时增强
过度绘制查看工具
image.png
image.png

优化步骤

  • 布局中是否有多余背景
    在style中去除主题背景
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!--去掉主题背景  对UI渲染进行优化-->
        <item name="android:windowBackground">null</item>
  
    </style>

在Activity中去除主题背景

getWindow().setBackgroundDrawable(null);

推荐使用style 去除 QQ就是这么做的

  • 是否可以删除多余布局(即看是否能删除只有一个子布局的结点)
    使用$<merge>$标签减少嵌套
  • 自定义View是否进行了裁剪
  • 布局是否扁平化
    使用相对布局减少线性布局使用,以及现在新出来的约束布局
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 近期学习布局优化以及渲染优化,在网上搜索相关博文后,发现知识点比较统一,所以做个学习总结,主要是方便自己掌握与运用...
    无问o阅读 4,455评论 1 6
  • 注意事项: 布局优化;尽量使用include、merge、ViewStub标签,尽量不存在冗余嵌套及过于复杂布局(...
    HarryXR阅读 10,634评论 1 19
  • 注:本文是我在 Android 界面性能调优知识的系统性总结,纯属个人碎碎念。秉持开源分享的原则发布本文出来,各位...
    东经315度阅读 4,093评论 0 8
  • 界面是 Android 应用中直接影响用户体验最关键的部分。如果代码实现得不好,界面容易发生卡顿且导致应用占用...
    passiontim阅读 5,829评论 0 8
  • 前几天看微博,恰好看到了一组鱼衔荷花的图,好似可以带来好运,今天看电视时想起就画了一副相关的插画,采用的是对角线构...
    戈颜阅读 5,022评论 0 6

友情链接更多精彩内容