过度绘制和渲染

最近在解过度绘制的问题单时,对过度绘制和渲染进行了简要的学习。

UI优化和UI渲染

UI 优化究竟指的是什么呢?应该包含两个方面:一个是效率的提升,我们可以非常高效地把 UI 的设计图转化成应用界面,在不同并且保证 UI 界面尺寸和分辨率的手机上都是一致的;另一个是性能的提升,在正确实现复杂、炫酷的 UI 设计的同时,需要保证用户有流畅的体验。

那什么是 UI 渲染呢?Android 的图形渲染框架十分复杂,不同版本的差异也比较大。但是无论怎么样,它们都是为了将我们代码中的 View 或者元素显示到屏幕中。而屏幕作为直接面对用户的手机硬件,类似厚度、色彩、功耗等都是厂家非常关注的。

GPU过度绘制定义

如果你粉刷过一个房间或一所房子,就会知道给墙壁涂上颜色需要做大量的工作。假如你还要重新粉刷一次的话,第二次粉刷的颜色会覆盖住第一次的颜色,第一次的颜色就永远不可见了,等于你第一次粉刷做的大量工作就完全被浪费掉。

同样的道理,如果在你的应用程序中浪费精力去绘制一些东西同样会产生性能问题。过度绘制这个名词就是用来描述屏幕上一个像素在单个帧中被重绘了多少次。

GPU过度绘制就指的是在屏幕一个像素上绘制多次(超过一次),GPU过度绘制或多或少对性能有些影响。

GPU过度绘制分析

过度绘制实际上是性能与设计的交叉。设计中追求的是绚丽的视觉效果,但一般而言,这种视觉效果将使用大量的层叠组件来实现,此时会带来过多的绘制问题。让我们看一下 Android界面层次关系的具体表现:
在绘制界面的时候,会有一个窗口,接下来就是建立活动,在这个活动中可以创建多个视图,或者视图组,并且视图可以嵌套视图。每个组件都是从上到下分布的,用户可以看到上面的组件,而下面的组件则看不到,但是仍然需要花费大量的时间来绘制这些不可见的组件,因为在某个时候,它也可能出现。

 

调试GPU过度绘制

调试GPU过度绘制主要通过在屏幕上显示不同的颜色来分析,它的开关在设置的开发者选项中,如下图所示:设置-开发者选项-调试GPU过度绘制-显示过度绘制区域(过度渲染等,不同机器可能不同)。

 

打开被测的应用[?]

可以看到不同地方的颜色不同,这个颜色是什么意思呢,下面给大家做一个解释:

  • 原色:无过度绘制
  • 蓝色:绘制一次(理想状态)
  • 绿色:绘制二次
  • 浅红:绘制三次(可以优化)
  • 深红:绘制四次(必须优化)

GPU过渡渲染不同的颜色代表不同的绘制程度,一般情况下颜色越深表示渲染的程度越重,颜色接近于原来的颜色那么它的渲染的话应该是非常少的。如果是原色,表示没有过度的绘制。如果蓝色的话表示只绘制了一次,这个是理想状态,绿色的话表示绘制两次,浅红为三次表示可以优化。如果是深红的话,表示绘制了四次就需要必须优化了。一般情况下,我们要控制绘制在两次以内,不允许存在四次这样的过渡绘制。

优化UI渲染

渲染流程中 measure 和 layout 是需要 CPU 在主线程执行的,对于这块内容网上有很多优化的文章,一般的常规方法有:

  • 减少 UI 布局层次。例如尽量扁平化,使用<ViewStub> <Merge>等优化。
  • 优化 layout 的开销。尽量不使用 RelativeLayout 或者基于 weighted LinearLayout,它们 layout 的开销非常巨大。这里我推荐使用 ConstraintLayout 替代 RelativeLayout 或者 weighted LinearLayout。
  • 背景优化。尽量不要重复去设置背景,这里需要注意的是主题背景(theme), theme 默认会是一个纯色背景,如果我们自定义了界面的背景,那么主题的背景我们来说是无用的。但是由于主题背景是设置在 DecorView 中,所以这里会带来重复绘制,也会带来绘制性能损耗。

这个优化工作对我来说是一个很有价值的经验,在解决这个问题单的时候,采用的解决方案是优化背景,去除重复设置的背景,但过度绘制其实还有很多其他的常用优化手段。比如:使用硬件加速、Create View优化(使用代码创建)(异步创建)(View重用)等,需要进一步深入学习。

建议

1.太多重叠的背景

  • 建议前期在设计时尽量保持整体背景统一
  • 开发可以检查你在布局和代码中设置的背景,有些背景是被隐藏在底下的,它永远不可能显示出来,这种没必要的背景一定要移除,因为它很可能会严重影响到app的性能。

2.太多重叠的view

  • 使用ViewStub来加载一些不常用的布局,它是一个轻量级且默认不可见的视图,可以动态的加载一个布局,只有你用到这个重叠着的view的时候才加载,推迟加载的时间。
  • 如果使用了类似viewpager+Fragment这样的组合或者有多个Fragment在一个界面上,需要控制Fragment的显示和隐藏,尽量使用动态地Inflation view,它的性能要比SetVisiblity好。

3.复杂的Layout层级

  • 推荐用Android提供的布局工具Hierarchy Viewer来检查和优化布局。
  • 如果嵌套的线性布局加深了布局层次,可以使用相对布局来取代。
  • 用标签来合并布局,这可以减少布局层次。
  • 用标签来重用布局,抽取通用的布局可以让布局的逻辑更清晰明了。

最终目的都是使得Layout在Hierarchy Viewer里变得宽而浅,而不是窄而深。

检查 GPU 渲染速度和过度绘制_知识空间-CSDN博客Android 包含一些设备上的开发者选项,可帮助您直观地查看您的应用可能会在何处遇到界面渲染问题,如执行不必要的渲染工作,或执行长时间的线程和 GPU 操作。本页介绍如何调试 GPU 过度绘制问题以及如何分析 GPU 渲染问题。如需详细了解设备上的开发者选项,包括如何启用它们,请阅读配置设备上的开发者选项。分析 GPU 渲染速度GPU 渲染模式分析工具以滚动直方图的形式直观地显示渲染界面窗口帧所花费的时间(以每帧 16 毫秒的速度作为对比基准)。在性能较低的 GPU 上,可用的填充率(GPU 填充https://blog.csdn.net/chaihuasong/article/details/111300529

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值