背景概念:
首先,Android显示系统中,系统默认的渲染器是OpenGL,混合使用skia,各个厂商可能有不同的实现,大部分都是OpenGL。 Android在系统启动时,经过BootLoader启动、kernel启动后,进入第三阶段,init进程会启动一系列的核心进程,其中包括ServiceManager、zygote、OpenGL,OpenGL是显示系统的基础,OpenGL启动之后,就可以播放动态的开机动画了。所以说,Android渲染的基础的OpenGL,而OpenGL渲染管线的最后一个阶段,就是帧缓冲区(FrameBuffer)。这也是文章讨论的重点。
FBO的现实需求:
前面提到,OpenGL渲染管线的最后一个阶段,就是帧缓冲区(FrameBuffer)。对于帧缓冲区,Android系统中默认有一个缓冲区,英文名称window-system-provided framebuffer,用于屏幕显示。 当GPU往显示缓冲区写入数据后,屏幕会显示这个缓冲区的内容。这是一个生产者消费者模型,大多数情况下能满足我们的需求。
而对于Android某些特殊需求来说,比如给视频加水印后渲染保存,比如Camera实时滤镜。 这些都需要把视频的原始data经过一定的处理后保存、或者再进行显示。
对于一般的Camera来说,我们用于预览/录制的Surface都是由Android系统提供给OpenGL渲染的帧缓冲区,OpenGL的所有渲染结果都是直接到达到帧缓冲区,这是on-screen的渲染方式;