帧缓冲区是一块内存,这个块内存可以是共享内存(CPU和GPU能同时访问),或者是显存,GPU可以直接访问
客户端先通过opengl es 绘制到 Graphicbuffer上(以共享内存作为帧缓存区),然后经过 sfufaceFlinger 合成,最终再有open gl es 绘制到显卡上(此时以显卡作为帧缓冲区,即frambuffer)
Surface 可以代表一个抽象窗口即共享内存是一个窗口(可以存放数据),此时Surface (虚拟窗口)利用共享内存实现双缓冲,显示器也代表一种窗口即显卡是一个窗口(frambuffer可以存放数据),
此时显示器(真实窗口)利用显存也可以实现双缓冲
所以opengl es 是一种双缓冲规范,给他提供内存,再根据定义好的接口实现双缓冲机制,就成了open gl 库
在open gl 中 只有0号帧缓冲区才可以上屏,所以你虽然创建了很多帧缓冲区,但是你用完这些帧缓冲区后,最后你得拷贝到0号帧缓冲区才能有机会上屏,因为eglswpebuffer 会把0号帧缓冲区切为前台。
Eglswpe 其实是把 后台”缓冲区“(你刚刚经过draw,然后又把fbo拷贝到0号帧缓冲区,刚刚渲染完的一帧)(可能是0号帧缓冲区吧),切换为前台”缓冲区“。
那么离屏渲染还需要进行eglswpebuffer吗?不需要,理解为渲染到一个后台窗口,只不过这个窗口是单缓存的,在窗口中绘制到Pbuffer内存区域(使用渲染缓冲区依附在FBO上)。
Pbuffer Surface 是单缓冲的 我们不需要调用 eglSwapBuffers 每次渲染操作直接写入 Pbuffer Surface,并可以在渲染完成后直接读取其内容用于其他处理。