Android图像显示流程
ApplicationàSkia/OpenGLàSurface,Surface,Surface,...
FrameBufferßOpenGLßSurfaceFlingerßSurface,Surface,Surface,....
由此可知,Surface分为2大部分:App与Surface,SF与Surface
App与Surface:App画出每一个Surface
SF与Surface:SF将所有Surface的内容混合,投递至FB显示
接下来主要分析第二部分,即SurfaceFlinger与Surface的关系
SurfaceFlinger主线程的位置
bool SurfaceFlinger::threadLoop(){}
(位于frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中)
SurfaceFlinger主线程的作用
混合图像
(将各个Surface传输的数据混合后,传输到FrameBuffer中显示)
SurfaceFlinger主线程主要分5步
1、waitForEvent
(等待事件)
2、handleTransaction
(处理事务)
3、handlePageFlip
(处理翻页)
4、handleRepaint
(处理重绘)
5、postFrameBuffer
(投递缓冲)
先看代码
waitForEvent()
{
....
case MessageQueue::INVALIDATE:
return;
....
}
当收到INVALIDATE这个消息后,便退出,执行主线程下一步
该消息的流程为
unlockCanvasAndPost()==>queueBuffer()==>mClient.signalServer()==>
mComposerService->signal()==>signal()==>signalEvent()==>
mEventQueue.invalidate()==>invalidate()==>mCondition.signal()
先看代码
handleTransaction()
{
....
handleTransactionLocked(transactionFlags,ditchedLayers);
....
ditchedLayers[i]->ditch();
....
}
这主要是处理一些Layer的控制操作
比如setPosition, setAlpha, show/hide,setSize, setFlag等
或者ditch掉一些layer,比如该layer被遮住了
先看代码
handlePageFlip()
{
....
lockPageFlip();
....
unlockPageFlip();
....
}
先通过lockPageFlip()根据FrontBuffer的内容生成一张纹理
再通过unlockPageFlip()做一些区域清理工作
这样每个layer都准备好了新数据,执行主线程下一步
先看代码
handleRepaint()
{
....
composeSurfaces();
....
}
调用composeSurfaces()函数将不同layer的内容进行混合
即按照Z轴顺序从里到外依次绘制,这是通过OpenGL实现的
具体流程是
composeSurfaces()==>layer->draw()==>draw()==>onDraw()==>
drawWithOpenGL()==>validateTexture(),...,一系列OpenGL函数
先看代码
postFramebuffer()
{
....
hw.flip();
....
}
先调hw.flip(),flip()再调eglSwapBuffers()将混合后的图像转递到屏幕
这样一张图就显示在屏幕上了
SurfaceFlinger投递完图像之后的流程是
framebuffer_device.cpp==>post_fb()==>ioctl()==>linuxframebuffer==>lcd