Android Render

一、Render介绍

Render(渲染):Render是Android系统中负责将绘制指令转化为实际图像的模块。它负责将Canvas中的绘制操作转化为最终的像素数据,并将其显示在屏幕上。Render会根据硬件设备的性能和特性,选择合适的渲染方式,如使用GPU进行硬件加速渲染。Render还会处理图像的混合、遮罩、滤镜等效果,以及处理动画效果。

Android渲染是指将应用程序的用户界面(UI)元素绘制到设备屏幕上的过程。Android系统使用一种称为View系统的机制来处理UI渲染。下面是Android渲染的一般流程:

  1. 布局:在Android中,UI界面通常使用XML文件进行布局描述。布局文件定义了UI元素的层次结构和位置关系。

  2. 解析:Android系统会解析布局文件,将UI元素转换为相应的View对象。每个View对象都有自己的属性和样式。

  3. 测量:在渲染之前,Android系统会对每个View对象进行测量,确定它们在屏幕上的大小和位置。这个过程是根据布局文件中的约束条件和测量规则进行的。

  4. 布局传递:在测量完成后,Android系统会根据测量结果和布局规则,确定每个View对象在屏幕上的准确位置。

  5. 绘制:一旦布局传递完成,Android系统会调用每个View对象的绘制方法,将其内容绘制到屏幕上。这个过程是通过调用View对象的draw()方法来实现的。

  6. 重绘:如果UI发生变化或需要更新,Android系统会触发重绘操作。重绘只会重新绘制发生变化的部分,以提高性能。

Android渲染的过程是高度优化的,系统会尽量减少不必要的绘制操作,以提高性能和响应速度。

二、RenderEngine相关类

RenderEngine

Android RenderEngine是Android系统中负责渲染图形和界面的引擎。它是Android系统的一部分,用于将应用程序的图形和界面元素绘制到屏幕上。

Android RenderEngine的主要功能包括:

  1. 绘制视图:RenderEngine负责将应用程序的视图层次结构绘制到屏幕上。它通过遍历视图层次结构,调用每个视图的绘制方法来完成绘制过程。

  2. 处理动画:RenderEngine支持处理应用程序中的动画效果。它可以根据动画的属性变化,实时更新视图的绘制结果,从而实现平滑的动画效果。

  3. 处理触摸事件:RenderEngine负责处理用户的触摸事件,并将其传递给相应的视图进行处理。它可以根据触摸事件的位置和动作类型,更新视图的状态并重新绘制。

  4. 硬件加速: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 {}
  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值