美文网首页
性能优化---过度绘制

性能优化---过度绘制

作者: chen_k | 来源:发表于2019-06-06 11:58 被阅读0次

    过度绘制

    过度绘制(Overdraw)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面, 如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。

    检测工具

    按照以下步骤打开Show GPU Overrdraw的选项:设置 -> 开发者选项 -> 调试GPU过度绘制 -> 显示GPU过度绘制。


    01
    • 蓝色: 代表1层覆盖。像素绘制了两次。大片的蓝色还是可以接受的,若整个窗口是蓝色的,可以摆脱一层。
    • 绿色: 代表2层覆盖。像素绘制了三次。中等大小的绿色区域是可以接受的但你应该尝试优化、减少它们。
    • 淡红: 代表3层覆盖倍。像素绘制了四次,小范围可以接受。
    • 深红: 代表4层覆盖。像素绘制了五次或者更多。这是错误的,要修复它们

    优化策略

    1.减少布局层级

    关闭相关手机上的开发者检测工具开关,打开Android Device Monitor, 找到 Hierarychy view 查看自己的布局找到,深的层级,是否可以做优化. 最外层父容器 是否需要。

    目前推荐使用ConstrintLayout(约束布局)
    如果使用线性布局LinearLayout排版有可能导致UI层次变深,如果有这类问题,我们可以使用ConstraintLayout或者相对布局RelativeLayout代替LinearLayout,减少UI的层次;如果不能减少布局层次推荐使用LinearLayout。

    没有用的父布局时指没有背景绘制或者没有大小限制的父布局,这样的布局不会对UI效果产生任何影响。我们可以把没有用的父布局,通过merge标签合并来减少UI的层次;

    2.去除不必要的背景

    有时候为了方便会先给Layout设置一个整体的背景,再给子View设置背景,这里也会造成重叠,如果子View宽度mach_parent,可以看到完全覆盖了Layout的一部分,这里就可以通过分别设置背景来减少重绘。再比如如果采用的是selector的背景,将normal状态的color设置为“@android:color/transparent”,也同样可以解决问题。适时使用Color.TRANSPARENT,因为透明色Color.TRANSPARENT是不会被渲染的,他是透明的。

    在开发过程中我们为某个View或者ViewGroup设置背景的时候,先思考下是否真的有必要,或者思考下这个背景能不能分段设置在子View上,而不是图方便直接设置在根View上。

    注意:在不同安卓版本的测试机中,去掉相同层次的背景色后,有的显示正常,有的不正常。

    相关文章

      网友评论

          本文标题:性能优化---过度绘制

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