说说Android--显示系统(三)

97 阅读2分钟

书接上文:

Android显示系统可以简单理解为:
Canvas 2D OpenGL ES等生产者从BufferQueue中获取FREE状态的GraphicBuffer,往里面填充显示内容,并塞入BufferQueue队列
SurfaceFlinger ImageReader等消费者从BufferQueue中获取QUEUED状态的GraphicBuffer,进行合成送显后releaseBuffer将GraphicBuffer置为FREE,循环往复。

这期我们开始讲Consumer(生产者)

image.png

对于开发者来说,我们更多地控制生产者这一侧,控制不同的展示内容。消费者更多是系统底层实现,我们后续再讲。

问题三:View Window Surface到底谁才是展示内容的?

我们原则是尽量讲清楚流程和原理,中间一些细节会带过,后续会分章节补充其中细节的详细解析。目的是让大家形成一个有体系的知识架构。

image.png

我们以Android中最常见的Activity展示为例:

  1. 我们通过Activity的setContentView(R.layout.xxx); 传入布局文件,在Activity的onResume时将内容展示出来(这里不理解的之后会开一篇文章讲解)

  2. 我们熟悉的View的展示逻辑(onMeasure onLayout onDraw)事实上是:

     1、需要显示图形时,首先创建一个Surface对象
     2、调用Surface#lockCanvas()获取Canvas对象
     3、调用Canvasdraw开头的函数执行一系列的绘图操作(View.onDraw)
     4、调用Surface#unlockCanvasAndPost()将绘制完成的图层提交,等待下一步合成显示
    

不要陷入细节中,现在是整体流程的把握:

1、 通过setContentView 设置需要渲染的View,View就是一个个矩形区域的树状结构

2、 ViewRootImpl中需要展示时通过创建Surface对象,获取Canvas,其实就是内部就是通过dequeueBuffer拿到一块GraphicBuffer,然后填充后放入到QueueBuffer中