Android通过GPU绘制UI的简单了解

Android绘制UI有两种绘制模型:

一是软件绘制模型;二是硬件加速绘制模型。

 

软件绘制模型

由CPU主导的,主要有两个步骤

  1. 让视图结构(view hierarchy)失效2
  2. 绘制整个视图结构。

具体来说当应用程序需要更新它的部分UI时,都会调用内容发生改变的View对象的invalidate()方法。无效(invalidation)消息请求会在View对象层次结构中传递,以便计算出需要重绘的屏幕区域(脏区)。然后,Android系统会在View层次结构中绘制所有的跟脏区相交的区域。

存在的缺陷

  1. 绘制了不需要重绘的视图(与脏区域相交的区域
  2. 掩盖了一些应用的bug(由于会重绘与脏区域相交的区域

硬件加速绘制模型

由GPU主导的,主要有三个步骤

  1. 让视图结构失效
  2. 记录和更新显示列表(Display List)
  3. 绘制显示列表

具体来说就是Android系统依然会使用invalidate()方法和draw()方法来请求屏幕更新和展现View对象。但Android系统并不是立即执行绘制命令,而是首先把这些View的绘制函数作为绘制指令记录一个显示列表中,然后再读取显示列表中的绘制指令调用OpenGL相关函数完成实际绘制。

另一个优化是,Android系统只需要针对由invalidate()方法调用所标记的View对象的脏区进行记录和更新显示列表。没有失效的View对象就简单重用先前显示列表记录的绘制指令来进行简单的重绘工作。

  使用显示列表的目的是,把视图的各种绘制函数翻译成绘制指令保存起来,对于没有发生改变的视图把原先保存的操作指令重新读取出来重放一次就可以了,提高了视图的显示速度。而对于需要重绘的View,则更新显示列表,然后再调用OpenGL完成绘制。

  在这种绘制模型下,我们不能依赖一个视图与脏区(dirty region)相交而导致它的draw()方法被自动调用,所以必须要手动调用该视图的invalidate()方法去更新显示列表。如果忘记这么做可能导致视图在改变后不会发生变化。

关于Surface,Window,View,Canvas和SurfaceView的区别

Surface

Surface就是指向显存的一个物体,用来被绘制到屏幕上,所有你能看见的Window都拥有可以在上面绘制的Surface,在安卓中,系统使用Surface Flinger服务来把Surface按照正确的深度信息渲染到最终的屏幕上。一个Surface一般拥有超过一个(通常是2个) buffer 单元(back buffer 与 front buffer),系统通常在back buffer中进行渲染,完成之后与front buffer交换,这样显示到屏幕上,以实现流畅显示的效果。

Window

Window拥有一个Surface,在Surface里绘制Window里的内容。一个application通过Windows Manager来创建窗口,Windows Manager为每一个窗口创建Surface来让application在上面绘制各种物体。

View

View就是窗口里的UI元素,一个窗口只拥有一个View Hierarchy,这些View Hierarchy提供了窗口里的所有表现。当一个窗口需要重新绘制时(比如一个View invalidate自己),锁定Surface,并返回一个Canvas用来在上面绘制,如上图所示,在view hierarchy树向下传递Canvas,来绘制每个view。这一切都完成后,Surface被解锁,并通过Surface Flinger交换前后Buffer来显示到屏幕上。

Canvas

Canvas是Surface绘图时返回的一个接口,并提供一些绘图api用来进行实际的绘图操作。目前Canvas可以绘制在bitmap或者openGL container上。

有个很好的例子

  • 画笔:Skia 或者 OpenGL。我们可以用 Skia 画笔绘制 2D 图形,也可以用 OpenGL 来绘 制2D/3D图形。正如前面所说,前者使用CPU绘制,后者使用 GPU 绘制。
  • 画纸:Surface。所有的元素都在 Surface 这张画纸上进行绘制和渲染。在 Android 中,Window 是 View 的容器,每个窗口都会关联一个 Surface。而 Windowmanager 则负责管理这些窗口,并且把它们的数据传递给 Surfaceflinger。
  • 展板:Graphic Buffer。Graphic Buffer 缓冲用于应用程序图形的绘制。
  • 显示:Surfaceflinger。它将 Windowmanager 提供的所有 Surface,通过硬件合成器 Hardware Composer 合成并输出到显示屏。

 

参考:

https://juejin.im/post/5cb5d49c5188251c5146cec1

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值