Android UI渲染组件 HWUI

Android HWUI(Hardware UI)是Android系统中的一个组件,用于处理应用程序的UI渲染操作。相比传统的软件渲染方式,HWUI可以利用GPU硬件绘制界面,提高绘制效率和流畅度,同时支持一些高级特性,如视图层叠、动画和自定义绘制等。以下介绍HWUI的主要模块及其功能点:

1.Skia

Skia是HWUI的核心图形库,提供了基本的绘制功能,包括图形、文本、位图等。它支持硬件加速渲染,能够充分利用GPU进行并发计算,加快UI界面的渲染速度。Skia还提供了强大的API接口,方便开发人员对图像进行自定义绘制和处理。

核心代码示例:

// 创建画布
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

OpenGL ES是HWUI与GPU之间的桥梁,负责将Skia生成的绘制命令转化为GPU能够执行的指令序列。 OpenGL ES 3.0是HWUI的默认版本,具有更好的功能和性能表现,例如添加了重要的纹理压缩格式和多重采样抗锯齿。

核心代码示例:

// 创建EGLContext、EGLSurface等
EGLDisplay display = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
EGLConfig config = getBestConfig(display);
EGLContext context = createContext(display, config);
EGLSurface surface = createWindowSurface(display, config);
// 使用OpenGL ES进行绘制
EGL14.eglMakeCurrent(display, surface, surface, context);
glClearColor(0.3f, 0.4f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 交换显示缓冲区
EGL14.eglSwapBuffers(display, surface);

3.DisplayList

DisplayList是HWUI的渲染列表,记录了绘制操作以及它们的位置、大小等信息。在绘制过程中,这些操作被显式地缓存起来,以便后续可以更快速地进行处理。DisplayList还允许视图树中相同的部分在多个帧之间重复使用,从而节约了可观的内存和带宽。

核心代码示例:

// 创建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的显示状态发生变化时,它会重新计算所有子项的布局和位置,并生成新的DisplayList。View绘制过程中使用的各种属性、例如透明度和边框等,都通过RenderNode保存和管理。

核心代码示例:

// 创建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();

猜你喜欢

转载自blog.csdn.net/weixin_44008788/article/details/130184349