上篇文章我们知道OpenGLES就是把3D数据加工显示到荧屏上,那么它产生的数据就必须经过HAL中的Gralloc模块输出到FrameBuffer上。
那么OpenGLES是如何把数据送给Gralloc的呢
首先假设我们点击手机home,那么可以看到当前荧屏展示的是n个应用界面,底层的是桌面应用(Surface),上边是应用程序首界面(Surface)。那么对于荧屏来说,这一块荧屏显示的不同区块是来自的不同进程,那么就是说在不同进程产生的区域最后汇集到一个平面(FramebufferNativeWindow)上,然后显示到荧屏上。
上边的Surface和FramebufferNativeWindow就分别是应用程序和surfaceFlinger的本地窗口
而surfaceFlinger是系统的显示服务。那么这里其实就明白了,和HAL中的Gralloc打交道就是FramebufferNativeWindow,
那么FramebufferNativeWindow的作用是啥,
FramebufferNativeWindow的作用其实就是加载HAL中的Gralloc,然后open fb(显示屏)和gralloc(缓冲区)设备,然后获取到设备属性。
这样其实就是操作荧屏抽象到自己类中,换句话说忽略到HAL层,FramebufferNativeWindow可以直接操作荧屏
这里还有个知识点就是FramebufferNativeWindow是如何分配buffer的
Android系统默认是双缓冲机制,也就是说最少有俩个缓冲区,(为什么?)
可以这么想我们如何循环利用这俩个缓冲区,当前缓冲区(mBufferHeader),总共缓冲区(mNumBuffers),可用的缓冲区(mFreeBuffer)
加锁
mBufferHeader++
if(mBufferHeader>mNumBuffers)mBufferHeader=0
if(mFreeBuffer<0)等待
被唤醒之后(就是有人释放了缓冲区)
申请到缓冲区mFreeBuffer--
下来说Surface
我们知道应用程序把自己想要绘制的图像放到surface上之后,不可能直接显示到荧屏上,而FramebufferNativeWindow直接操作缓冲区,那么surface就是内存,只有所有应用程序surface,都放在内存里,然后有FramebufferNativeWindow统一汇集到荧屏上,这个就是有SurfaceFlinger完成的
那么申请内存buffer有是如何过程呢
简单说下就是,当应用程序申请(BufferQueue)到一个空闲surface,然后向里面填充数据,然后surface变成了可用的,然后通知surfaceFlinger 找到可用的surface,然后进行一系列操作,然后让surface变成空闲,放回去这样就循环利用了
网友评论