精华内容
下载资源
问答
  • android过度绘制

    2015-10-27 18:09:56
    通过View的提前绘制,从根本上解决android过度绘制
  • 操作的是否顺畅、卡顿,决定着整体的流畅程度。事实上android跟iphone的差别,个人觉得很大程度上决定于流畅程度,无论是动画,还是列表滑动等相关操作,流畅与否,对于用户而言,虽然他们说不出来哪里不对,但是卡...
  • 过度绘制和渲染

    2021-10-07 00:17:49
    最近在解过度绘制的问题单时,对过度绘制和渲染进行了简要的学习。 UI优化和UI渲染 UI 优化究竟指的是什么呢?应该包含两个方面:一个是效率的提升,我们可以非常高效地把 UI 的设计图转化成应用界面,在不同并且...

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

    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

    展开全文
  • Android渲染性能——过度绘制

    万次阅读 2020-11-25 20:15:23
    过度绘制是我们在开发过程中,常见的一种性能问题,按照性能影响的分类,它应该属于渲染性能。那么过度绘制到底代表了什么含义呢?我们又如何能够避免过度绘制呢?

    Android渲染性能——过度绘制


    过度绘制是我们在开发过程中,常见的一种性能问题,按照性能影响的分类,它应该属于渲染性能。那么过度绘制到底代表了什么含义呢?我们又如何能够避免过度绘制呢?

    概述

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

    首先,我们从定义来分析,这里有几个关键词:“某个像素”、“同一帧”、“绘制多次”、“多层”、“不可见UI"。那么我们其实根据这些关键词,可以分析出一些结论:

    1. 过度绘制是同一个像素点,被绘制了多次造成的。
    2. 浪费大量的 CPU 以及 GPU 资源。
    3. 过度绘制通常由于 UI 层次比较多,并且在同一个区域,不可见的 UI 和可见 UI 同时参与了绘制。
    4. UI 层次很多,不一定有过度绘制,它们之间没有必然联系。
      在这里插入图片描述

    随着 APP 的视觉效果和复杂度的提升,我们就容易陷入采用越来越多的层叠组件来实现这种视觉效果的怪圈。这很容易导致大量的性能问题,为了获得最佳的性能体验,我们必须尽可能的减少过度绘制情况的发生。

    过度绘制的检测

    我们可以通过 Android 的系统工具,很方便的进行过度绘制的检测。

    具体可以在手机设置里面的开发者选项,打开”调试 GPU 过度绘制“(Show GPU Overdraw)的选项,在打开的选择项中,可以选择“显示过度绘制区域”,这样就可以观察 UI 界面上的过度绘制情况了。

    注意:这里菜单选项的名称,根据手机厂商的不同,略有区别。

    在这里插入图片描述

    如图,过度绘制分为4个级别,分别用一种颜色来表示:

    1. 蓝色:代表同一个像素点多绘制了1次。
    2. 淡绿:代表同一个像素点多绘制了2次。
    3. 淡红:代表同一个像素点多绘制了3次。
    4. 深红:代表同一个像素点多绘制了4次以上。

    我们的目标就是尽量减少红色区域,看到更多的蓝色区域。

    常见场景及优化方案

    过度绘制是我们开发过程中非常常见的性能问题,它会导致渲染时间变长,甚至造成丢帧、卡顿等性能问题。

    那么,我们开发中场景的过度绘制有哪些场景呢?又如何进行优化呢?

    接下来用一些示例来说明一下。

    1. Activity 布局中的过度绘制

    Activity 中设置了背景颜色,然后 Activity 中的内容也设置了背景颜色,并且完全覆盖了 Activity 的背景颜色,这时就会产生 1 次的过度绘制,并且如果内部视图非常复杂,子容器也设置了背景颜色,这样就会产生红色区域(4+次)。

    解决方法:

    这类问题,其实只需要把未显示的背景色设置为透明即可,当然,没必要的嵌套视图也要去掉,减少布局层级。

    2. 半透明对象产生的过度绘制

    如果我们的页面中,存在一些过度动画或者其他原因设置的半透明视图,这些视图虽然几乎不可见,但是也会在测量、布局、渲染阶段进行操作,由此会导致丢帧等问题,并且半透明视图增加了GPU渲染时,图层合并的开销,应该尽量避免使用。

    解决方法

    • 设置视图的不可显示;
    • 视图未使用时,使用 ViewPager 等方式延迟初始化视图;
    • 在视图使用完成后,将视图在视图树中移除。

    3. ImageView 设置默认背景

    当我们使用图片时,尤其是网络获取图片,首先会显示一个占位背景图,然后当图片加载完成后,显示真实图片。这时,操作不当就会产生过度绘制问题。

    解决方法

    在获取到真实图片后,应该把 ImageView 的 background 设置为透明即可。

    以上是一些过度绘制的示例,仅供大家参考。

    总结


    1. 过度绘制描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次的问题。
    2. 过度绘制是同一个像素点,被绘制了多次造成的。
    3. 过度绘制会浪费大量的 CPU 以及 GPU 资源。
    4. 过度绘制通常由于 UI 层次比较多,并且在同一个区域,不可见的 UI 和可见 UI 同时参与了绘制。
    5. 过度绘制会造成丢帧、卡顿等性能问题。
    6. UI 层次很多,不一定有过度绘制,它们之间没有必然联系,但层次过度会影响测量布局等阶段,同样会造成丢帧、卡顿等性能问题。
    7. 我们可以在手机设置里面的开发者选项,打开”调试 GPU 过度绘制“(Show GPU Overdraw)的选项开查看过度绘制问题。
    8. 开发中,应该尽量避免布局背景重叠、避免由过度绘制导致的渲染性能问题。

    PS:性能优化专栏:《Android性能》持续更新中……

    展开全文
  • Android 界面过度绘制优化

    千次阅读 2018-09-07 10:34:33
    过度绘制(Overdraw)的概念 过度绘制(Overdraw)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的 UI 结构里面,如果不可见的 UI 也在做绘制的操作,会导致某些像素区域被绘制了多次,同时...

    过度绘制(Overdraw)的概念

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

         在 Android 手机的开发者选项中,有一个『调试 GPU 过度绘制』的选项,该选项开启之后,手机显示如下,显示出来的蓝色、绿色的色块就是过度绘制信息。

     也可以使用adb命令打开GPU过渡绘制:

    开启『调试 GPU 过度绘制』:adb shell setprop debug.hwui.overdraw show

    关闭『调试 GPU 过度绘制』:adb shell setprop debug.hwui.overdraw false

     

    比如上面界面中的『调试 GPU 过度绘制 』的那个文本显示为蓝色,表示其过度绘制了一次,因为背景是白色的,然后文字是黑色的,导致文字所在的区域就会被绘制两次:一次是背景,一次是文字,所以就产生了过度重绘。

    在官网的 Debug GPU Overdraw Walkthrough 说明中对过度重绘做了简单的介绍,其中屏幕上显示不同色块的具体含义如下所示:

     

    每个颜色的说明如下:

    • 原色:没有过度绘制
    • 蓝色:1 次过度绘制
    • 绿色:2 次过度绘制
    • 粉色:3 次过度绘制
    • 红色:4 次及以上过度绘制

    过度绘制的存在会导致界面显示时浪费不必要的资源去渲染看不见的背景,或者对某些像素区域多次绘制,就会导致界面加载或者滑动时的不流畅、掉帧,对于用户体验来说就是 App 特别的卡顿。为了提升用户体验,提升应用的流畅性,优化过度绘制的工作还是很有必要做的。

    优化原则

    • 一些过度绘制是无法避免的,比如之前说的文字和背景导致的过度绘制,这种是无法避免的。
    • 应用界面中,应该尽可能地将过度绘制控制为 2 次(绿色)及其以下,原色和蓝色是最理想的。
    • 粉色和红色应该尽可能避免,在实际项目中避免不了时,应该尽可能减少粉色和红色区域。
    • 不允许存在面积超过屏幕 1/4 区域的 3 次(淡红色区域)及其以上过度绘制。

    优化方法

    1)移除布局中不需要的背景
    2)将layout层级扁平化
    3)减少透明度的使用

    1.移除默认的 Window 背景

           一般应用默认继承的主题都会有一个默认的 windowBackground ,比如默认的 Light 主题:

           <style name="Theme.Light">
        <item name="isLightTheme">true</item>
        <item name="windowBackground">@drawable/screen_background_selector_light</item>
        ...
    </style>

    但是一般界面都会自己设置界面的背景颜色或者列表页则由 item 的背景来决定,所以默认的 Window 背景基本用不上,如果不移除就会导致所有界面都多 1 次绘制。

    可以在应用的主题中添加如下的一行属性来移除默认的 Window 背景:

    <item name="android:windowBackground">@android:color/transparent</item>
    <!-- 或者 -->
    <item name="android:windowBackground">@null</item>

    或者在 BaseActivityonCreate() 方法中使用下面的代码移除:

    getWindow().setBackgroundDrawable(null);
    // 或者
    getWindow().setBackgroundDrawableResource(android.R.color.transparent);

    2.移除不必要的背景

             比较常见的可优化场景:ViewPager 加多个 Fragment 组成的首页界面,如果你的每个 Fragment 都设置有背景色的话, 你就可以不用给 Activity 的根布局设置背景,如果你还给 ViewPager 还设置了背景,那个这个背景是没必要的,同样可以移除。

    3.将layout层级扁平化

            往往我们在写界面的时候都会使用基本布局来实现,这可能会出现一些性能问题。比如:使用嵌套的LinearLayout可能会导致布局的层次结构变得过深。另外,如果在LinearLayout中使用了layout_weight的话,那么他的每一个子 view都需要测量两次。特别是用在 ListView 和 GridView 时,他们会被反复测量。

    布局嵌套过多的话会导致过度绘制,从而降低性能,因此我们需要将布局的层次结构尽量扁平化。

    3.1使用Layout Inspector去查看layout的层次结构

             在Android Studio中点击Tools > Android > Layout Inspector。然后在出现的 Choose Process 对话框中,选择想要检查的应用进程即可。

    Layout Inspector会自动捕获快照,然后会显示以下内容:

    • View Tree:视图在布局中的层次结构。

    • Screenshot:每个视图可视边界的设备屏幕截图。

    • Properties Table:选定视图的布局属性。

    通过左侧View Tree即可看到布局中的层次结构 

    3.1使用嵌套少的布局

    3.2使用merge标签减少嵌套

    通过<include>标签能够复用布局。

    比如,我们要复用如下的一个布局,一个垂直的线性布局包含一个ImageViewTextView,其布局文件layout_include.xml如下:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <ImageView
            ...
            />
        <TextView
            ...
            />
    </LinearLayout>

    然后我们就可以通过<include>来复用这个布局了,其布局文件activity_include.xml如下:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff"
        android:orientation="vertical">
        <include layout="@layout/layout_include"/>
        <include layout="@layout/layout_include"/>
        <include layout="@layout/layout_include"/>
    </LinearLayout>

    但是上面这个例子会有个问题:其父布局是垂直的线性布局,include进来的也是垂直的线性布局,这就会造成了布局嵌套,而且这种嵌套是没必要的,那么就可以使用<merge>标签来减少这种嵌套。将layout_include.xml改成以下即可:

    <merge
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <ImageView
            ...
            />
        <TextView
            ...
            />
    </merge>

    3.3 使用lint来优化布局的层次结构

    lint是一个静态代码分析工具,可以用来协助优化布局的性能。要使用lint,点击AnalyzeInspect Code即可,如下图所示:

    inspec Code

     布局性能方面的信息位于AndroidLintPerformance下,我们可以点开它来看下一些优化建议。

    4.减少透明度的使用

    对于不透明的view,只需要渲染一次即可把它显示出来。但是如果这个view设置了alpha值,则至少需要渲染两次。这是因为使用了alphaview需要先知道混合view的下一层元素是什么,然后再结合上层的view进行Blend混色处理。透明动画、淡入淡出和阴影等效果都涉及到某种透明度,这就会造成了过度绘制。可以通过减少渲染这些透明对象来改善过度绘制。比如:在TextView上设置带透明度alpha值的黑色文本可以实现灰色的效果。但是,直接通过设置灰色的话能够获得更好的性能。

    5.减少自定义View的过度绘制,使用clipRect()

    6.使用ViewStub标签延迟加载

    在项目中,有些复杂的布局很少使用到,比如进度指示器等等。那么我们可以通过<ViewStub>标签来实现在需要时才加载布局。使用<ViewStub>能够减少内存的使用并且加快渲染速度。

     

    展开全文
  • 安卓过度绘制

    2019-11-18 11:34:32
      使用复杂的Shape有时候也是引起过度绘制的一个因素,比如Stroke,虽然只是描边,但是会增加整个区域的一层过度绘制。例如,将下面的配置作为ImageView的背景。 在有stroke属性的时候,显示为淡红色,去掉...

    1.概述

      UI渲染操作通常依赖于两个核心组件:CPU与GPU。CPU负责包括Measure,Layout,Record,Execute的计算操作,GPU负责Rasterization(栅格化)操作。   所谓栅格化,就是将那些UI控件(如Button,Bitmap)拆分到不同的像素上进行显示。这是一个很费时的操作,GPU能够加快栅格化的操作。   为了能够使得App流畅,在Android中我们有一个16ms准则。这是因为Android平台的屏幕刷新频率一般为60Hz,也就是大概16.6ms一帧。也就是说在16ms内我们的CPU和GPU必须完成所有的计算,绘制,渲染操作,否则就有可能出现掉帧,卡顿现象,引发性能问题,伤害用户体验。   过度绘制(Overdraw)指的是屏幕上的某个像素在同一帧(16ms)的时间内被绘制了过多次数。   有很多原因可以导致丢帧,也许是因为你的layout太过复杂,无法在16ms内完成测量和布局,有可能是因为你的UI上有层叠太多的绘制单元,还有可能是因为动画执行的次数过多。也有可能是是主线程中做了其他耗时操作,或者线程数量太多。这些都会导致CPU或者GPU负载过重。

    2.GPU过渡绘制调试

    开启:adb shell setprop debug.hwui.overdraw show

    关闭:adb shell setprop debug.hwui.overdraw false

    3.过度绘制的分级:

    原色:没有过度绘制

    蓝色:1 次过度绘制

    绿色:2 次过度绘制

    粉色:3 次过度绘制(不应超过屏幕的四分之一)

    红色:4 次及以上过度绘制(不能出现)

    4.避免过度绘制

    4.1去掉Activity的冗余的背景

    (1)当我们新建一个Activity时,Activity的Theme主题上往往自动有一个背景。但是很多时候这个背景是多余的,我们自己使用的控件往往已经设置了背景;

    在APP Theme中把背景改掉:

    <style name="AppTheme" parent="android:Theme.Light.NoTitleBar">
        <item name="android:windowBackground">@null</item>
        ...
    </style>

    2)还有很多时候我们在Activity的布局文件中的根Layout上就已经设置了background属性,这样的情况下,这个Activity自带的背景就多余了。

    在Activity的onCreate()中试用以下代码:

              getWindow().setBackgroundDrawable(null);


    如果是在Fragment中,就是

               getActivity().getWindow().setBackgroundDrawable(null)

    4.2 ImageView的background和setImageDrawable()重叠

      我们平时使用ImageView等类似的显示图片的控件时,通常会有一个加载未完成时的占位图,很多时候我们习惯用background属性进行添加。等到网络将图片请求到之后我们又使用setImageDrawable()设置了图片,这样子图片会覆盖掉原来的占位图,但是Android系统绘制界面时原来的占位图和现在的图片都会被绘制,造成了Overdraw。

    就是占位图和后来加载到的图片都使用setImageDrawable()来设置,而不要使用background

    4.3 减少Drawable的复杂Shape

      使用复杂的Shape有时候也是引起过度绘制的一个因素,比如Stroke,虽然只是描边,但是会增加整个区域的一层过度绘制。例如,将下面的配置作为ImageView的背景。

    在有stroke属性的时候,显示为淡红色,去掉stroke属性后,显示为绿色。

    4.4使视图层级扁平化

      现代布局使视图堆叠和分层更加容易。然而,这样做却会过度绘制,从而导致性能降低。特别在每一个堆叠视图对象是不透明的场景中,可见和不可见的像素都需要绘制在屏幕上。

      如果遇到这类问题,可以通过优化视图层次结构来减少重叠的UI对象数量,从而提升性能。

    要想扁平化布局效果,可以使用约束性布局ConstraintLayout。

    4.5自定义控件中onDraw函数的正确使用

      在自定义控件中,我们经常会通过onDraw函数绘制一些复杂的形状、文字、图片等。但是这些Canvas的绘制函数,每一次调用就会增加一层的绘制,次数越多也就会导致越多的过度绘制。如我们用如下代码来自定义绘制图形,就会存在绘制三次的情况:

    4.6通过Merge标签减少View树层次

      我们在自定义可重用布局的时候,都会新建一个文件来存放这个布局。当我们在文件中include这个布局文件的时候,很可能就额外多了一层的布局。如果这时候使用Merge的话,再使用包含这个的布局的时候,系统会自动忽略merge层级,把它的子view直接放置与include平级的布局下。还有一种情况,例如在LinearLayout等布局里面嵌入一个布局时,刚好这个布局的根节点也是LinearLayout等布局的时候,既两层布局使用了同一种类型的布局时,这样就多了一层没有用的嵌套,而这个时候如果使用merge根标签就可以避免这样的问题,减少这层无用的嵌套。

      不过只能作为XML布局的根标签使用。当Inflate以开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true。

    4.7通过ViewStub标签优化布局

      一些显示错误的界面、加载提示框的界面,ProgressBar等界面,以及用户很少会触发的界面,当这些不是必须显示的布局都堆在一起时,会对infalte性能、内存等产生不利影响。这个时候用ViewStub标签就很合适,可以将这些不常用的布局另外保存为布局文件,对应的位置布局用ViewStub标签代替。等到真正需要显示的时候再对ViewStub初始化。因为ViewStub是一个轻量级的View,它是一个不可见,且不占布局位置,占用资源非常小的控件。所以使用ViewStub后,可以加快Inflate的时间,减少创建的对象数量,从而提升性能和减少内存的占用。不过ViewStub只能Inflate一次,一旦初始化后该标签就会被真正的布局所代替。

    4.8减少不需要的View

      一方面减少层级本身就是减少了view的数量,另外像一些场景,文字有大有小,有不同颜色,其实用一个TextView就可以实现,例如可以借助Spannable对象实现。不需要使用很多个TextView来实现。

    另外,有时我们发现一个空白区域的占位也使用了一个view去做,其实用layout_margin属性或者用其他方式就能代替掉这个View。

    展开全文
  • 性能优化之过度绘制

    千次阅读 2018-09-13 12:19:15
    最近接到一个任务,优化项目中的过度绘制问题。提到过度绘制,脑海中会浮现出include,merge,ViewStub标签,减少ViewTree的层次等等优化布局相关,但具体怎么进行优化,有一种无从下手的感觉。认真仔细阅读了官方...
  • 调试 GPU过度绘制 GPU呈现模式分析 其实这两个工具所解决的问题并不相同,之所以把它们放在一起,是因为它们都是Android手机自带的分析工具,我们只要在设置中对应的开关,就可以实时获得分析的结果,下面,我们就一起来...
  • 自定义View一直是安卓开发中比较困难的技术点,实现一个优秀的自定义View控件不仅涉及到View的定位、测量、绘制等知识体系,还涉及到控件的绘制效率、是否存在过度绘制、是否存在绘制时间超长、是否存在内存泄漏等...
  • 过度绘制的危害以及产生的原因,可以参考网络资料。 优化过度绘制,是为了保证APP的流畅度,而APP卡顿不全部是因为布局问题导致的, 布局问题会导致渲染时间延长 从而造成卡顿。 所以当有掉帧的时候,不一定是布局...
  • 本页介绍如何调试 GPU 过度绘制问题以及如何分析 GPU 渲染问题。 如需详细了解设备上的开发者选项,包括如何启用它们,请阅读配置设备上的开发者选项。 分析 GPU 渲染速度 GPU 渲染模式分析工具以滚动直方图的形式...
  • 过度绘制是指,屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结 构里,如果不可见的UI也在做绘制的操作,会导致某些像素区域被绘制了多次,同时 会浪费CPU和GPU资源。 在Android手机设置的...
  • 关于过度绘制和渲染的介绍

    千次阅读 2017-11-05 20:31:21
    在Android中,UI渲染太慢和过度绘制是造成卡顿的主要原因。 关于UI渲染: Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60...
  • 关于GPU过度绘制的那些误解

    千次阅读 2019-05-21 17:12:14
    提到防止页面卡顿,大家首先想到的会是页面层级嵌套过多导致过度绘制。那么达到什么程度页面才算过度绘制呢? 绘制限制 手机屏幕由很多像素点组成,通过变换每个像素点的颜色,形成各种各样的图像。GPU控制的一块...
  • View回顾---过度绘制

    2021-03-11 20:22:38
    应用可能会在单个帧内多次绘制同一个像素,这种情况称为“过度绘制”。过度绘制通常是不必要的,最好避免。它会浪费 GPU 时间来渲染与用户在屏幕上所见内容无关的像素,进而导致性能问题。 过度绘制检测 可以使用...
  • 调试 GPU 过度绘制和GPU 呈现模式分析是Android 手机自带的分析工具。能比较方便的帮助开发者检验是否存在 overdraw 和卡顿的问题,但是不能帮忙定位问题。 位置:开发者选项 调试 GPU 过度绘制 应用场景 这个工具...
  • 一、 背景设置产生的过度绘制、 二、 Android 系统的渲染优化、 1. 透明组件数据传递、 2. GPU 存储机制、 3. Android 7.0 之后的优化机制、 三、 自定义布局渲染优化、
  • 过度绘制 补充 检测布局中的背景重叠 检测视图层级 Hierarchy Viewer工具检测 clipRect 和 quickReject 方法 背景 之前我们的项目开发周期,从两周发一个版本,变成一周发一版本,这种快速迭代的节奏持续了...
  • Overdraw就是过度绘制,是指在一帧的时间内(16.67ms)像素被绘制了多次,理论上一个像素每次只绘制一次是最优的,但是由于重叠的布局导致一些像素会被多次绘制, 而每次绘制都会对应到CPU的一组绘图命令和GPU的一些...
  • Android性能优化--过度绘制

    千次阅读 2017-05-12 17:58:18
    渲染机制前提知识android 的渲染主要分为两个组件:1.CPU 2.GPU,由这两者共同完成在屏幕上绘制 。 CPU:中央处理器,它集成了运算,缓冲,控制等单元,包括绘图功能.CPU将对象处理为多维图形,纹理(Bitmaps、Drawables等...
  • ​该工具主要用来监控安卓app的页面是否有过度绘制问题,通过minicap和opencv图像识别做的;该工具还可以配合monkey的自动化运行,对有页面进行监控,对于有监控绘制的可能,会自动化截图; 其他话不多,重点在于...
  • Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次 。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。 当设计...
  • Android中过度绘制

    2017-07-14 16:26:53
    什么是过度绘制? Overdraw(过度绘制)是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面, 如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次,这就浪费大量的CPU以及GPU...
  • APP GPU过度绘制及优化

    千次阅读 2017-08-28 14:51:48
    一、Android端的卡顿 Android端APP在具体使用的过程中容易出现卡顿的情况,比如查看页面时出现一顿一顿的感受,...其中过度绘制,是一个容易被忽视但也最好修改并且能够看到效果的内容,其中Android官网给出的过度...
  • 一、什么叫过度绘制 什么叫过度绘制,网上看到一个栗子,很形象。过度绘制就像是家里装修刷墙面,假设本来最终想要得到的墙面效果颜色是蓝色,结果在刷蓝色之前,先刷了一层白色,再刷一层绿色,再来一层红色,最后...
  • Android UI性能优化—过度绘制

    千次阅读 2017-03-24 10:33:01
    Android UI性能优化——过度绘制过度绘制(overdraw)过度绘制介绍每过几年,就会有传闻说某个博物馆在用x光扫描一副无价的名画之后,发现画作的作者其实重用了老的画布,在名画的底下还藏着另一副没有被发现的...
  • Android性能优化-过度绘制解决方案

    万次阅读 多人点赞 2017-01-08 14:15:53
    过渡绘制:屏幕上某一像素点在一帧中被重复绘制多次,就是过渡绘制。 下图中多个卡片跌在一起,但是只有第一个卡片是完全可见的。背后的卡片只有部分可见。但是android系统在绘制时会将下层的卡片进行绘制,接着再...
  • 布局优化的方式大概有如下几点: 减少层级:通过合理的使用RelativeLayout 、LineaLayout 和ConstraintLayout具体效率这里不再阐述。 合理使用Merge ...避免过度绘制 本文主要讲述第五条避免过度绘制, ...
  • 本文主要介绍了如下内容: 1、什么是GPU过度绘制? 2、GPU过渡绘制监测工具使用方式; 3、OverDraw优化。 本文属于Android UI优化系列的一部分。
  • 这个分析工具可以帮助确定GPU在图形绘制过程中各阶段的状态,或过度绘制引起渲染性能降低的情况。 打开 GPU 呈现模式分析 在Android 4.1以上的系统中,需要分析应用的GPU呈现速度时,可以通过两种方式打开 GPU ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,963
精华内容 7,985
关键字:

过度绘制