SurfaceFlinger的分析理解,基于android4.4.2 aosp源码

整体描述:

每一个应用程序,对应SF中的一个Client对象;

每一个应用程序的Surface,对应SF中对应Client对象中的一个Layer对象;

应用程序在Surface上借助skia或者opengles去绘制图形,绘制的结果通过调用eglSwapBuffer()从而进入对应Layer对象监控的BufferQueue中;这个过程底层涉及的过程为:

从Layer控制的BufferQueue中dequeueBuffer,也就是得到一个用于绘图的缓冲区;在这个buffer上调用opengles绘制完成后,调用eglSwapBuffer实际是queueBuffer过程;这个函数结束前,通知BufferQueue的监听者,有buffer准备好了;而bufferqueue的监听者就是Layer本身,它会调用自身的Layer::onFrameAvailable函数,从而通知SF有数据到来;然后SF在下一个Vsync信号到来时,开始执行一系列的合成工作并最终显示到displaydevice上;

这块有需要区分的:

BufferQueue:每个应用的每一个Surface都对应一个BufferQueue;SF中的每一个DisplayDevice也有一个BufferQueue;

Surface的BQ是用来为应用程序画图的;

DisplayDevice的BQ是当SF在合成layers时,在调用hwcomposer的prepare后,获取的那些layers需要使用opengl去合成的,这部分layers就是SF通过opengl去合成,合成最后会同样执行elgSwapBuffer,也就是入BQ的队列中,同样有监听者FramebufferSurface::onFrameAvailable;合成的最终结果再和能够被hwc合成的layer一起通过hwc来合成;

这块强调的意思是,我们的BQ,是有两级的概念;

你可能感兴趣的:(SurfaceFlinger的分析理解,基于android4.4.2 aosp源码)