Surfaceflinger 概述

来源:互联网 发布:开淘宝店怎么代理货源 编辑:程序博客网 时间:2024/06/06 03:11


Android图像显示流程

ApplicationàSkia/OpenGLàSurface,Surface,Surface,...                                                      

FrameBufferßOpenGLßSurfaceFlingerßSurface,Surface,Surface,....

由此可知,Surface分为2大部分:AppSurfaceSFSurface

AppSurfaceApp画出每一个Surface

SFSurfaceSF将所有Surface的内容混合,投递至FB显示

接下来主要分析第二部分,即SurfaceFlingerSurface的关系





SurfaceFlinger主线程的位置


   bool SurfaceFlinger::threadLoop(){}


   (位frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中)


SurfaceFlinger主线程的作用


   混合图像


   (将各个Surface传输的数据混合后,传输到FrameBuffer中显示)





SurfaceFlinger主线程主要分5


   1waitForEvent


            (等待事件


   2handleTransaction


            (处理事务)


   3handlePageFlip


            (处理翻页)


   4handleRepaint


            (处理重绘)


   5postFrameBuffer


            (投递缓冲)




先看代码


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


0 0
原创粉丝点击