1 [定义] Surface是何方神圣
google Surface.java 的原文解释 【Handle onto a raw buffer that is being managed by the screen compositor.】
说人话: Surface 就是一块Buffer的封装,它被SurfaceComposer使用, SurfaceFlinger是其中之一
再进一步:Surface 由GraphicBufferAllocator 分配 ,来源于Native层
更深一层:那块神圣的raw buffer, 是由 GraphicBufferAllocator 来料加工而成,来源于底层ION 管理的,或者者framebuffer device 对应的地址空间
2 [客户] Surface 为谁服务
android.graphics.SurfaceTexture ----- 图片应用
android.media.MediaRecorder ----- 截屏,录屏, 虚拟显示
android.opengl.EGL14 ----- GPU, game,opengl graphic
---- Surface 是android OpenGl 之 NativeWindow 的后端实现
android.media.MediaPlayer ----- Decoder
android.hardware.camera2.CameraDevice ----- Camera
3 [实现] Surface如何显神通
重要的事情,提前说。孙悟空战斗力爆表,是因为寻寻觅觅找到了那根金箍棒。Surface显神通,他的利器,就是BufferQueue.
. 因为有了BufferQueue, 以及内嵌其中的GraphicBufferProducer, GraphicBufferConsumer, 实现了跨进程,以及自动的消息通知机制
----- 比如Opengl 对应的swapBuffer, 内部对应IGraphicBufferProduder的,dequeueBuffer,enqueueBuffer.
进而触发,Consumer那一端的onFrameAvailable.
. GraphicBuffer 通过Allocator 分配之后, 在进程链 的链路上,可以多次映射,每次穿越Binder ,都会产生一次映射。
【待续----】