android4.0.1 surfaceflinger系统分析

本文深入分析了Android 4.0.1中的SurfaceFlinger系统,探讨了ISurfaceComposer、ISurfaceComposerClient、ISurfaceTexture和ISurface四个接口的Binder结构,并提供了相关接口Proxy端的类图,为理解Android图形系统提供了关键信息。
摘要由CSDN通过智能技术生成

先给出本篇的主要结论:

1.ISurfaceComposer,ISurfaceComposerClient, ISurfaceTexture,ISurface这四个接口描述了SurfaceFlinger系统及其客户端的定义和协作方式。
2.ISurfaceComposer定义了SurfaceFlinger系统,它的server端的具体实现类是SurfaceFlinger。它的Proxy端封装在类ComposerService中。ComposerService的定义在SurfaceComposerClient.h中。 SurfaceFlinger的客户端通过ComposerService与SurfaceFlinger系统 通信。
3.ISurfaceComposerClient定义了SurfaceFlinger系统的客户端,它的server端的具体实现类是Client, 定义在SurfaceFlinger.h中。它的Proxy端封装在类         SurfaceComposerClient中,每个SurfaceComposerClient的创建都会使SurfaceFlinger系统创建类Client的一个实例。ISurfaceComposerClient接口只提供两个操作createSurface和destroySurface。
4.ISurfaceTexture接口非常重要,是连接SurfaceFlinger系统及其客户端的桥梁,ISurfaceTexture接口的server端实现是SurfaceTexture。ISurfaceTexture接口的proxy端的具体实现封装在SurfaceTextureClient中。Surface是SurfaceTextureClient的子类,客户端通过Surface实例与server端的SurfaceTexture协作。SurfaceTexture中维护着一组GraphicBuffer,这组GraphicBuffer被SurfaceFlinger及其客户端使用。客户端通过Surface(即通过SurfaceTextureClient)提供的接口获得这组 GraphicBuffer的某一空闲块,将需要显示的屏幕内容绘制在其上,然后再通过Surface(即通过SurfaceTextureClient)提供的接口将这块含有屏幕内容的Buffer放回队列。SurfaceFlinger通过Layer操作这组GraphicBuffer中含有当前屏幕内容的一块,通过Layer调用SurfaceTexture中封装的gles操作,将包含屏幕内容的GraphicBuffer上传给纹理,再通过LayerBase::drawWithOpenGL中调用glDrawArrays将纹理内容渲染到framebuffer。SurfaceFlinger接着调用egl接口eglSwapBuffer将绘制好的framebuffer显示在屏幕上。
5.Layer类中封装了SurfaceTexture,SurfaceTexture中维护着一组GraphicBuffer,屏幕内容会先绘制在这组GraphicBuffer上。
6.ISurface的Server端实现类是Layer::createSurface()函数中创建的类Bsurface,ISurface的proxy端封装在类Surface中,ISurface只提供一个操作getSurfaceTexture。Surface调用这个接口取得SurfaceTexture的proxy端,以便与SurfaceTexture通信。

下面的类图是ISurfaceComposer,ISurfaceComposerClient,ISurfaceTexture,ISurface这四个接口的Binder结构,封装各个接口Proxy端的类也一并给出,便于后面分析:

                                                                                                                                

接下来看几组类之间关系的建立过程。
1.SurfaceComposerClient与SurfaceFlinger之间关系的建立过程分析
Android4.0.1 Activity的DecorView与SurfaceFlinger的Surface之间关系的建立过程分析中提到过
WindowMangerService中代表客户端的Session会创建一个SurfaceSession实例,这个SurfaceSession
实例代表着与SurfaceFlinger之间的一个连接。SurfaceSession的构造函数会调用native函数init(),
这个函数的实现SurfaceSession_init()定义在android_view_surface.cpp中。
SurfaceSession_init()函数会创建一个SurfaceComposerClient实例,并将这个实例保存到java层
SurfaceSession的mClient变量中。SurfaceSession_init()在创建完SurfaceComposerClient实例后会
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值