一、Render介绍
Render(渲染):Render是Android系统中负责将绘制指令转化为实际图像的模块。它负责将Canvas中的绘制操作转化为最终的像素数据,并将其显示在屏幕上。Render会根据硬件设备的性能和特性,选择合适的渲染方式,如使用GPU进行硬件加速渲染。Render还会处理图像的混合、遮罩、滤镜等效果,以及处理动画效果。
Android渲染是指将应用程序的用户界面(UI)元素绘制到设备屏幕上的过程。Android系统使用一种称为View系统的机制来处理UI渲染。下面是Android渲染的一般流程:
-
布局:在Android中,UI界面通常使用XML文件进行布局描述。布局文件定义了UI元素的层次结构和位置关系。
-
解析:Android系统会解析布局文件,将UI元素转换为相应的View对象。每个View对象都有自己的属性和样式。
-
测量:在渲染之前,Android系统会对每个View对象进行测量,确定它们在屏幕上的大小和位置。这个过程是根据布局文件中的约束条件和测量规则进行的。
-
布局传递:在测量完成后,Android系统会根据测量结果和布局规则,确定每个View对象在屏幕上的准确位置。
-
绘制:一旦布局传递完成,Android系统会调用每个View对象的绘制方法,将其内容绘制到屏幕上。这个过程是通过调用View对象的draw()方法来实现的。
-
重绘:如果UI发生变化或需要更新,Android系统会触发重绘操作。重绘只会重新绘制发生变化的部分,以提高性能。
Android渲染的过程是高度优化的,系统会尽量减少不必要的绘制操作,以提高性能和响应速度。
二、RenderEngine相关类
RenderEngine
Android RenderEngine是Android系统中负责渲染图形和界面的引擎。它是Android系统的一部分,用于将应用程序的图形和界面元素绘制到屏幕上。
Android RenderEngine的主要功能包括:
-
绘制视图:RenderEngine负责将应用程序的视图层次结构绘制到屏幕上。它通过遍历视图层次结构,调用每个视图的绘制方法来完成绘制过程。
-
处理动画:RenderEngine支持处理应用程序中的动画效果。它可以根据动画的属性变化,实时更新视图的绘制结果,从而实现平滑的动画效果。
-
处理触摸事件:RenderEngine负责处理用户的触摸事件,并将其传递给相应的视图进行处理。它可以根据触摸事件的位置和动作类型,更新视图的状态并重新绘制。
-
硬件加速:RenderEngine支持硬件加速,利用GPU来加速图形渲染过程。通过利用硬件加速,可以提高应用程序的性能和响应速度。
Android RenderEngine是基于Skia图形库实现的,Skia是一个跨平台的2D图形库,提供了丰富的绘图功能和性能优化。RenderEngine通过与Skia的集成,实现了高效的图形渲染和界面绘制。
RenderEngine代码位于:
frameworks/native/libs/renderengine/include/renderengine/RenderEngine.h
frameworks/native/libs/renderengine/RenderEngine.cpp
RenderEngine的定义:
class RenderEngine {}
struct RenderEngineCreationArgs {}
struct RenderEngineCreationArgs::Builder {}
struct RenderEngineResult {}
RenderNode
RenderNode是一个绘制节点,一个大的界面是由很多小的绘制单元组成,这个正如View的层级结构,整个界面由很多控件组成,这样带来的好处就是需要整体绘制界面的时候,只有那些变化的单元重新绘制,然后在重新组装界面即可。这让我联想到了活字印刷术,当我们要印刷一页内容的时候,如果将所有的字都刻在一块板上,当要修改的时候,就需要整体重新来刻,效率很低成本很高,但是如果是将每一个字作为一个组件,页面只是这些字拼接出来的,修改或者重用的话就相对容易很多,RenderNode就相当于是一个个的字。
尽管在应用层我们很少使用这个类,但是实际上的每个View都持有 一个RenderNode,我们可以这样去理解,View作为一个组件,会由很多业务,比如事件,布局,测量和绘制等,而绘制业务正是委托给RenderNode去完成,绘制需要Canvas也是由这个RenderNode提供的。RenderNode除了为View提供绘制能力外,还为其他可绘制的API提供绘制能力,最常见的就是Drawable,我们也可以封装自己的绘制组件,基于RenderNode的绘制是利用了硬件加速的绘制。
在应用层,View会形成树型的层级结构,因此RenderNode也会相应的构造一个出绘制节点的树形结构。但是RenderNode的树形结构和View的树形结构可能是不一样的,因为一个View可能会对应着几个RenderNode,比如View的背景也会转换成一个RenderNode,因此一个View节点可能会产生多个RenderNode对象,通常一个View的背景和View的的Children是平级的。
RenderNode代码位于:
frameworks/base/libs/hwui/RenderNode.h
frameworks/base/libs/hwui/RenderNode.cpp
RenderNode的定义:
class RenderNode : public VirtualLightRefBase {}