本文首发于微信公众号——世界上有意思的事,搬运转载请注明出处,否则将追究版权责任。微信号:a1018998632,交流qq群:859640274
大家好,新的一年又正式开始了,笔者在这里给大家拜个晚年。最近写的文章需要涉及到的知识很多,所以更新比较慢,望大家海涵。最近申请了一个微信公众号:世界上有意思的事,二维码在文章底部,以后我的文章首发都会在这个公众号上面。简书、掘金会在几个小时之后同步,所以希望大家能来关注我的公众号,大量干货在这里等着你。进入微信公众号 世界上有意思的事 发送消息:Android绘制机制以及Surface家族源码全解析,即可获取本文的 pdf 版。
本篇文章分为以下章节,读者可以按需阅读
阅读须知
在深入各种源码之前,我们需要了解 Android 绘制机制的整体架构,以及一些概念
图1:屏幕刷新.jpg
图1就是 Android 屏幕显示的抽象示意图,这里我来解释一下:
问大家一个问题:平时我们开发过程中可以用哪些工具在屏幕上绘制图像?大家一定可以回答出很多东西:View、Drawable、xml、SV、GLSurfaceView、TV、Canvas等等。其实 Android 上面一共只有两种常用的绘图机制,上面列举出来的东西都是由这两种机制演变而来的。这一节我就简单归纳介绍一下。
Android 的两种常用绘图机制:
android 的绘制机制中存在着一系列生产者和消费者,这一节我将介绍一下这个机制中相关的概念。
图2:BufferQueue.png
这一章我们来从源码上分析 View 是如何绘制到屏幕上面的,前面的 measure、layout、draw 等等 framework 层的东西我不会着重分析,我主要分析 cpp 层的东西。
图3:Android绘制机制.png
其实源码的主要流程都在图3中,我下面讲的东西算是对图3的补充和说明。另外强烈建议结合 Android 源码阅读本章节。
图4:硬件加速下的Canvas绘制流程.png
上一章我们讲了 Android 的整个绘制机制,但是其中涉及到 Surface 的部分都是简单带过。所以这一章我就来解析一下 Surface 家族中各个成员的源码。
图5:Surface 创建.png
**这里我们以 View 的创建流程为例,讲述一下 Surface 在这个过程中的创建流程,Surface 的创建流程如图5所示。 **
我们在第二章里面说到 View 的绘制根据是否硬件加速分为,软件绘制与硬件绘制两种。当时我们分析了硬件绘制,软件绘制略过了。其实软件绘制与硬件绘制的区别就在于是使用 CPU 进行绘制计算还是使用 GPU 进行绘制计算。这一小节的 Surface 绘制其实就是软件绘制,也就是 ViewRootImpl.drawSoftware 中的内容。
图6:Surface 绘制.png
我们都知道 Surface 可以通过 lockCanvas 和 unlockCanvasAndPost 这两个 api 来再通过 Canvas 来绘制图像,这一节我就通过这两个 api 来讲讲 Surface 的绘制流程,整个流程如图6所示。
其实只要了解了 Surface 的创建与使用,那么 SV 就很简单了,SV.updateSurface 中会创建或者更新 Surface。在 SV 上绘制也是调用 Surface 的两个 api。这里我就简单将 View 与 SV 比较一下。
ST 我们平时可能用的不是很多,但是其实它是 TV 的核心组件。它可以将 Surface 提供的图像流转换为 GL 的纹理,然后对该内容进行二次处理,最终被处理的内容可以被交给其他消费者消费。这一节我们就来从源码层次解析一下 ST。
图7:SurfaceTexture概览图.png
图7是 ST 与 Surface、SV、TV 等等组件结合的概览图,我这里简单解释一下:
图8:SurfaceTexture创建以及使用.png
我将根据图8的流程来讲解 ST 的创建与使用
它可以将内容流直接投影到 View 中,可以用于实现视频预览等功能。和 SV 不同,它不会在WMS中单独创建窗口,而是作为 View Hierachy 中的一个普通 View,因此可以和其它普通 View 一样进行移动,旋转,缩放,动画等变化。值得注意的是 TV 必须在硬件加速的窗口中。它显示的内容流数据可以来自 App 进程或是远端进程。这一节我们就来从源码上分析它。因为 TV 需要硬件加速,所以它最终也是由渲染线程绘制的,而我们在第一章中讲述了 ThreadRender.java、RenderProxy.cpp、RenderThread.cpp 等等类在渲染线程中的作用,所以这一小节关于渲染线程的东西就直接使用而不再赘述了。
图9:TextureView创建和使用.png
和前面一样,本小节接下来的分析也都是顺着图9来的
这篇文章真是写死我了!!过年有三分之二的时间花在这个上面,感觉这篇文章真的是笔者有史以来写过的最有干货的一篇文章了,希望能够对大家有所帮助。另外看在我这么辛苦的份上,希望大家能顺手关注一下我的公众号:世界上有意思的事,二维码就在文章底部,跪谢!!