首页 > 其他分享 >Android HWUI

Android HWUI

时间:2024-08-14 18:29:26浏览次数:16  
标签:HWUI 渲染 RenderNode UI GPU Android 绘制

Android HWUI(Hardware Accelerated Rendering Engine for UI)是Android系统中用于处理UI渲染的硬件加速引擎。它的主要作用是利用GPU(图形处理单元)来加速UI的渲染过程,从而提高渲染效率和流畅度。以下是Android HWUI工作的主要方式和步骤:

 

一、基本工作原理

传统软件的UI绘制是依靠CPU来完成的,硬件加速就是将绘制任务交由GPU来执行。

HWUI基于GPU加速,通过Skia Backend与GPU进行交互,将UI绘制任务从CPU转移到GPU上执行。这种方式可以显著提高绘制性能,特别是在高分辨率屏幕和复杂UI场景下。

  • GPU相比CPU更加适合完成光栅化、动画变换等耗时任务,在移动设备上比起使用CPU来完成这些任务,GPU会更加省电,带来的用户体验也会更佳。
  • 现代移动GPU支持可编程管线,可以高效地开发应用界面的一些特效(吸入、渐变、模糊、阴影)


Skia Backend有两种:SkiaGl和SkiaVk,分别对应后端OpenGLES和Vulkan

二、核心组件

  1. Skia图形库:
    • Skia是HWUI的核心图形库,提供了基础的绘制功能,如图形、文本、位图等。
    • 它支持硬件加速渲染,能够充分利用GPU进行并发计算,加快UI界面的渲染速度。
    • 代码示例
      // 创建画布
      Canvas canvas = new Canvas(bitmap);
      // 绘制矩形
      Paint paint = new Paint();
      final int color = Color.BLUE;
      paint.setColor(color);
      RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
      canvas.drawRoundRect(rect, 32, 32, paint);
  2. OpenGL ES/Vulkan:
    • OpenGL ES/Vulkan是HWUI与GPU之间的桥梁,负责将Skia生成的绘制命令转化为GPU能够执行的指令序列。
    • OpenGL ES 3.0是HWUI的默认版本,具有更好的功能和性能表现。未来HWUI的Backend默认会切换到Vulkan。
  3. DisplayList:
    • DisplayList是HWUI的渲染列表,用于记录绘制操作以及它们的位置、大小等信息。
    • 这些操作被显式地缓存起来,以便后续可以更快速地进行处理,并允许视图树中相同的部分在多个帧之间重复使用,从而节约内存和带宽。
    • 代码示例
      // 创建DisplayList
      DisplayList displayList = new DisplayList("MyList");
      displayList.start(512, 512); //设置宽高
      // 添加绘制操作
      Paint paint = new Paint();
      paint.setColor(Color.RED);
      paint.setStyle(Paint.Style.FILL);
      displayList.drawRect(64, 64, 256, 256, paint);
      // 结束DisplayList
      displayList.end();
  4. RenderNode:
    • RenderNode是HWUI的渲染节点,对应于视图层次结构中的一个节点。
    • 每个View持有一个RenderNode,这些RenderNode组成树形结构,用于管理和组织渲染任务。
    • RenderNode负责保存和管理View绘制过程中使用的各种属性,如透明度和边框等。
    • 代码示例
      // 创建RenderNode
      RenderNode renderNode = new RenderNode("MyNode");
      // 更新RenderNode属性
      View view = findViewById(R.id.myView);
      renderNode.setPosition(view.getLeft(), view.getTop());
      renderNode.setElevation(view.getElevation());
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
      renderNode.setBitmapCache(bitmap);
      // 添加子节点
      RenderNode child = new RenderNode("MyChild");
      //更新child属性
      renderNode.addChild(child);
  5. Layers
    • Layer是HWUI的另一个重要概念,用于实现UI的专业效果和动画效果。
    • 在Android 10及以前的系统中,所有视图都隶属于共享的系统组层级。但是在Android 11及以后的系统中,每个窗口/活动/碎片都将拥有自己的独立图层级别,从而增强了性能和隐私管理。
    • 代码示例
      // 创建Layer
      Layer layer = mSurface.getLayer();
      layer.setX(100);
      layer.setY(100);
      layer.setAlpha(0.5f);
      // 在Layer上绘制图像和文字
      Canvas canvas = layer.lockCanvas();
      canvas.drawBitmap(bitmap, 0, 0, paint);
      canvas.drawText(text, 30, 100, paint);
      layer.unlockCanvasAndPost(canvas);
  6. HardwareComposer
    • HardwareComposer是Android系统中的硬件合成器,作为HWUI的主要接口之一。
    • 它的作用是在GPU输出图像到屏幕之前,对多个应用程序的渲染结果进行混合和组合,从而形成最终的显示内容。
    • 在硬件合成情况下,不需要将应用程序的UI渲染成一个帧缓存(FrameBuffer)并上传到系统RAM,从而减少内存和总线带宽的负担。
    • 代码示例
      RoutingTable routingTable = hwcomposer.createRoutingTable();
      routingTable.setOutputConfig(new OutputConfiguration(mDisplayToken, Display.DEFAULT_DISPLAY));
      Destination destination = routingTable.createDestination();
      destination.setColorMode(ColorMode.SRGB);
      destination.setBufferStream(bufferStream);
      surfaceFlinger.setTransactionState(routingTable.getTransaction());
      surfaceFlinger.applyTransaction();
  7. Threaded Rendering(多线程渲染):
    • 为了最大化利用CPU性能,HWUI采用了多线程渲染模式。
    • 通常包括UI线程和RenderThread(RT线程)。UI线程负责View的绘制逻辑和将绘制命令打包成Skia的绘制命令存储到DisplayList;RT线程则负责取出这些绘制命令并执行实际的渲染操作。

三、工作流程

  1. UI线程绘制:
    • 当View需要被绘制时,UI线程会调用相应的绘制方法(如onDraw())。
    • 这些绘制方法通过Canvas类提供的接口进行绘制操作,Canvas的绘制命令会被转化为Skia的绘制命令并存储到DisplayList中。
  2. RenderThread渲染:
    • RenderThread从DisplayList中取出绘制命令,并通过OpenGL ES接口将这些命令发送给GPU执行。
    • GPU完成绘制后,将渲染结果输出到屏幕上。
  3. 性能优化:
    • HWUI还采用了多种性能优化技术,如延时渲染列表(Deferred Display List)、绘制命令合并(Draw Op Batching)等。
    • 这些技术通过减少GPU的调用次数、优化渲染状态切换等方式来提高渲染效率。

四、总结

Android HWUI通过利用GPU进行硬件加速渲染,显著提高了Android系统的UI渲染性能和流畅度。它通过Skia图形库、OpenGL ES接口、DisplayList、RenderNode以及多线程渲染等技术手段实现了高效的UI渲染过程。同时,HWUI还不断引入新的性能优化技术来进一步提升渲染效率。

标签:HWUI,渲染,RenderNode,UI,GPU,Android,绘制
From: https://www.cnblogs.com/ArsenalfanInECNU/p/18359530

相关文章

  • Android-代码混淆及字符串加密
    代码混淆使用ProGuard&R8一些参考链接Android混淆,新引入的D8、R8改变了什么?sdk打包必备,proguard混淆规则如何配置开启混淆app/build.gradle.android.buildTypesrelease{minifyEnabledtrue//开启混淆proguardFilesgetDefaultProguardFile('proguard-and......
  • 丢掉数据线,你还会调试Android设备吗?
    ADB(Android Debug Bridge)作为Android开发中非常重要的工具,开发者可以使用ADB设备在电脑上对Android设备进行安装调试应用。通常我们使用ADB调试时需要USB数据线进行连接,当Android设备USB接口出现问题或身边没有USB数据线时,使用WiFi调试Android设备便成为了一种实用的替代方案。......
  • Android中四大组件Acticity面试常问的五道题
    Activity1、A到BActivity过程中生命周期是怎么样的当从ActivityA启动ActivityB时,ActivityA的生命周期会经历以下过程:onPause():ActivityA会暂停,此时它仍然可见,但处于暂停状态,无法与用户交互。onStop():如果ActivityB完全覆盖了ActivityA,那么ActivityA会......
  • Android 10.0 SystemUI下拉状态栏QSTileView去掉着色效果显示彩色图标功能实现
    1.前言在10.0的系统rom定制化开发中,在关于SystemUI的下拉状态栏中QSTileView的背景颜色设置过程中,在由于系统原生有着色效果,导致现在某些彩色背景显示不是很清楚效果不好,所以需要去掉QSTileView的默认着色背景显示原生的彩色背景,接下来就来实现相关功能如图: 2.SystemUI......
  • Android 13 GMS 内置壁纸
    如图,原生系统上,设备上的壁纸显示系统内置壁纸。如果没有添加内置壁纸,就显示默认的壁纸。点击进去就是预览页面扩展下,默认壁纸在frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.pngframeworks/base/core/res/res/drawable-nodpi/default_wall......
  • RK3399 Android8.1静默安装APK
    在RK3399Android8.1上面,实现APK静默安装功能,下面是我们的测试验试过程:1.在RK3399Android8.1源码目录下生成系统签名KEY:  进入build/target/product/security目录:cdbuild/target/product/security  创建build_system_jks2.sh文件,内容如下:#!/bin/bashecho"生......
  • 如何使用Android WakeLock?
    在Android应用或者Framworks里面,要如何使用AndroidWakeLock来避免系统待机,或者系统息屏后加个锁进行网络等后台操作处理呢?我们可以在代码里面导入并创建相应对象,有如下内容:importandroid.os.PowerManager;importandroid.os.PowerManager.WakeLock;WakeLockmWakeLock;P......
  • Android Studio Gradle->Android Studio创建项目后,生成文件详解
    Gradle版本:gradle-8.0AndroidStudio版本:AndroidStudioGiraffe|2022.3.1Patch3.gradle文件夹作用:存储Gradle缓存和构建信息内容:包括Gradle构建缓存、已下载的依赖项等。这个文件夹可以安全地删除,Gradle会在下次构建时重新生成它.idea文件夹作用:存......
  • # Android开发 - FileWriter 类写入文件解析
    FileWriter是什么FileWriter是一个用于将字符数据写入文件中的类。在Java中,它使得文件的写入操作变得简单直观FileWriter继承自OutputStreamWriter类,进一步继承自WriterFileWriter构造方法FileWriter(StringfileName):创建一个FileWriter对象,用于写入指定文件......
  • Android开发 - File类文件操作解析
    File是什么File类用于处理文件和目录。它允许你创建、删除、读取和写入文件。你可以用它来获取文件路径、检查文件是否存在、获取文件大小等。例如,Filefile=newFile(context.getFilesDir(),"example.txt");可以用来在应用的私有目录中创建一个名为example.txt的文件......