Surfaceflinger 概述

本文详细解析了Android系统的图像显示流程,重点介绍了SurfaceFlinger如何处理来自各Surface的数据,并将其混合后显示在屏幕上。涉及的主要步骤包括等待事件、处理事务、处理翻页、处理重绘及投递缓冲。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值