美文网首页
UI绘制优化

UI绘制优化

作者: Dear月 | 来源:发表于2021-01-21 00:53 被阅读0次

    性能优化的目的不是优化项目,而是优化编码习惯。--jett

    CPU 与GPU工作流程

    image.png
    image1.png
    image2.png
    image3.png
    image4.png

    VSYNC(vertical synchorinzed) 垂直同步信号
    VR 视频看上去头晕是因为帧数不够

    image5.png

    CPU处理信息--->GPU绘制信息,这两个过程在周期中无论那个过程未完成,都会丢帧 如image5 中的“绿色方块儿2、3、4”

    image.png
    image6.png
    image7.png
    查看方法

    开发者选项->Profile GPU rendering/调试GPU过度绘制

    image8.png

    配置文件 GPU 渲染速度

    配置文件 GPU 渲染工具作为滚动直方图显示渲染 UI 窗口的帧相对于每帧 16 毫秒的基准需要多少时间的可视化表示。

    在功能较低的 GPU 上,可用填充速率(GPU 填充帧缓冲区的速度)可能相当低。随着绘制帧所需的像素数增加,GPU 可能需要更长时间来处理新命令,并要求系统的其余部分等待,直到它能够赶上。分析工具可帮助您识别 GPU 何时在绘制像素时不堪重负或因大量透支而不堪重负。

    注意:此分析工具不能与使用 NDK 的应用使用。这是因为每当 OpenGL 采用全屏上下文时,系统都会将框架消息推送到后台。在这种情况下,您可能会发现 GPU 制造商提供的分析工具很有帮助。

    启用探查器

    开始之前,请确保使用运行 Android 4.1 (API 16) 或更高版本的设备,并启用开发人员选项。若要在使用应用时开始分析设备 GPU 渲染,请按照以下步骤操作:

    1. 在设备上,转到"设置"并点按"开发人员选项"。
    2. 在"监视"部分中,选择"配置文件 GPU 渲染"。
    3. 在"配置文件 GPU 渲染"对话框中,选择"在屏幕上"作为条形图,以覆盖设备屏幕上的图形。
    4. 打开要分析的应用。

    检查输出

    在图 1 所示的配置文件 GPU 渲染图的放大图像中,您可以看到在 Android 6.0(API 级别 23)上显示的彩色部分。

    image

    图1。放大的配置文件 GPU 渲染图。

    以下是有关输出的一些需要注意的事项:

    • 对于每个可见的应用程序,该工具将显示一个图形。
    • 沿水平轴的每个垂直条表示一个帧,每个垂直条的高度表示帧渲染所需的时间(以毫秒为单位)。
    • 水平绿线表示 16 毫秒。要达到每秒 60 帧,每个帧的垂直条需要保持在这条线以下。当条形超出此行时,动画中可能会暂停。
    • 该工具通过使相应的条形更宽且透明度更低来突出显示超过 16 毫秒阈值的帧。
    • 每个条形都有映射到渲染管道中阶段的颜色组件。组件的数量因设备的 API 级别而异。

    下表提供了使用运行 Android 6.0 及更高版本的设备时探查器输出中垂直条的每个段的说明。


    表1.Android 6.0 及更高版本的组件条

    4.0(API 级别 14)和 5.0(API 级别 21)之间的 Android 版本具有蓝色、紫色、红色和橙色段。4.0 以下的 Android 版本只有蓝色、红色和橙色组件。下表显示了 Android 4.0 和 5.0 中的组件栏。


    表2.**Android 4.0 和 5.0 中的组件条

    有关如何解释分析工具提供的信息的信息,请阅读使用配置文件GPU 渲染进行分析

    注:虽然此工具名为配置文件 GPU 渲染,但所有受监视的进程实际上都发生在 CPU 中。渲染通过向 GPU 提交命令而发生,GPU 以异步方式呈现屏幕。在某些情况下,GPU 可能有太多的工作要做,并且 CPU 必须等待才能提交新命令。发生这种情况时,您将在橙色和红色条形中看到峰值,并且命令提交将阻止,直到在 GPU 命令队列上创建更多空间。

    image9.png

    过度绘制优化(主要是减少GPU工作量)

    1.减少背景重复

    注意主题中的设置

    去掉单个Activity主题设置属性,可以在*setContentView*之前
     getWindows().setBackgroundDrawable(null) 
    
    去掉所有activity中主题设置中的属性 直接在 styles.xml中设置
    <item name="ansroid:windowBackground">@null<item>
    
    非业务需求,不要设置背景
    

    *透明颜色CPU会进行计算,但GPU不会绘制

    2.使用裁剪减少控件之间的重复部分
            canvas.clipRect((float)c.x,0f,(float)(mDroidCards.get(i+1).x),(float)c.height);
    

    Android 7.0之后系统做出的优化--invalidate()不再执行测量和布局工作

    布局的优化 (主要减少CPU工作量)

    常用工具

    Android/sdk/tools/bin/ui automator viewer.bat
    Android\sdk\tools\monitor.bat
    Device Monitor窗口中Hierarchy view

    三个点也是代表着View的Measure, Layout和Draw。

    • 绿: 表示该View的此项性能比该View Tree中超过50%的View都要快;例如,代表Measure的是绿点,意味着这个视图的测量时间快于树中的视图对象的50%。
    • 黄: 表示该View的此项性能比该View Tree中超过50%的View都要慢;
    • 红: 表示该View的此项性能是View Tree中最慢的;。

    注意点:
    1.能在一个平面显示的内容,尽量只用一个容器
    2.尽可能把相同的容器合并merge
    3.能复用的代码,用include处理,可以减少GPU重复工作

    相关文章

      网友评论

          本文标题:UI绘制优化

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