1.1.1 postFramebuffer
在多缓冲区机制中,只有把显示数据写入framebuffer才能真正在物理屏幕上显示。前面几个小节的输出都是backbuffers,我们还需要最后一步——postFramebuffer。
void SurfaceFlinger::postFramebuffer()
{…
const DisplayHardware&hw(graphicPlane(0).displayHardware());
…
hw.flip(mSwapRegion);//交换前后台buffer
size_t numLayers =mVisibleLayersSortedByZ.size();
for (size_t i = 0; i <numLayers; i++) {
mVisibleLayersSortedByZ[i]->onLayerDisplayed();
}
…
}
先从opengl本地窗口的角度来想一下:
queueBuffer
一旦“生产者”完成生产后,它需要把当前的buffer重新入队,以使“消费者”可以做接下来的处理
dequeueBuffer
为了“生产者”可以继续下一轮的工作,它会重新deque
基本的思路就是这样子,不过Android系统将一些步骤封装到了DisplayHardware中,我们稍后会看到。
DisplayHardware::flip完成后,分别通知各可见Layer它们的内容已经显示出来了。
void DisplayHardware::flip(const Region& dirty) const
{…
mPageFlipCount++;//flip计数
if (mHwc->initCheck()== NO_ERROR) {
mHwc->commit();
} else {
eglSwapBuffers(dpy, surface);
}
…
}