Andoird 核心分析之GDI SurfaceFlingerWord下载.docx

上传人:b****5 文档编号:20477039 上传时间:2023-01-23 格式:DOCX 页数:7 大小:344.21KB
下载 相关 举报
Andoird 核心分析之GDI SurfaceFlingerWord下载.docx_第1页
第1页 / 共7页
Andoird 核心分析之GDI SurfaceFlingerWord下载.docx_第2页
第2页 / 共7页
Andoird 核心分析之GDI SurfaceFlingerWord下载.docx_第3页
第3页 / 共7页
Andoird 核心分析之GDI SurfaceFlingerWord下载.docx_第4页
第4页 / 共7页
Andoird 核心分析之GDI SurfaceFlingerWord下载.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

Andoird 核心分析之GDI SurfaceFlingerWord下载.docx

《Andoird 核心分析之GDI SurfaceFlingerWord下载.docx》由会员分享,可在线阅读,更多相关《Andoird 核心分析之GDI SurfaceFlingerWord下载.docx(7页珍藏版)》请在冰豆网上搜索。

Andoird 核心分析之GDI SurfaceFlingerWord下载.docx

SurfaceFlinger的基本组成框架

SurfaceFlinger管理对象为:

mClientsMap:

管理客户端与服务端的连接。

ISurface,IsurfaceComposer:

AIDL调用接口实例

mLayerMap:

服务端的Surface的管理对象。

mCurrentState.layersSortedByZ:

以Surface的Z-order序列排列的Layer数组。

graphicPlane缓冲区输出管理

OpenGLES:

图形计算,图像合成等图形库。

gralloc.xxx.so这是个跟平台相关的图形缓冲区管理器。

pmemDevice:

提供共享内存,在这里只是在gralloc.xxx.so可见,在上层被gralloc.xxx.so抽象了。

2SurfaceFingerClient和服务端对象关系图

Client端与SurfaceFlinger连接图:

 

Client对象:

一般的在客户端都是通过SurfaceComposerClient来跟SurfaceFlinger打交道。

3主要对象说明

3.1DisplayHardware&

FrameBuffer

首先SurfaceFlinger需要操作到屏幕,需要建立一个屏幕硬件缓冲区管理框架。

Android在设计支持时,考虑多个屏幕的情况,引入了graphicPlane的概念。

在SurfaceFlinger上有一个graphicPlane数组,每一个graphicPlane对象都对应一个DisplayHardware.在当前的Android(2.1)版本的设计中,系统支持一个graphicPlane,所以也就支持一个DisplayHardware。

SurfaceFlinger,Hardware硬件缓冲区的数据结构关系图。

3.2Layer

method:

setBuffer 

在SurfaceFlinger端建立显示缓冲区。

这里的缓冲区是指的HW性质的,PMEM设备文件映射的内存。

1)layer的绘制

voidLayer:

:

onDraw(constRegion&

clip)const

{

intindex=mFrontBufferIndex;

GLuinttextureName=mTextures[index].name;

drawWithOpenGL(clip,mTextures[index]);

}

3.2mCurrentState.layersSortedByZ

以Surface的Z-order序列排列的LayerBase数组,该数组是层显示遮挡的依据。

在每个层计算自己的可见区域时,从Z-order顶层开始计算,是考虑到遮挡区域的裁减,自己之前层的可见区域就是自己的不可见区域。

而绘制Layer时,则从Z-order底层开始绘制,这个考虑到透明层的叠加。

4SurfaceFlinger的运行框架

我们从前面的章节<

AndroidService>

的基本原理可以知道,SurfaceFlinger的运行框架存在于:

threadLoop,他是SurfaceFlinger的主循环体。

SurfaceFlinger在进入主体循环之前会首先运行:

SurfaceFlinger:

readyToRun()。

4.1SurfaceFlinger:

readyToRun()

(1)建立GraphicPanle

(2)建立FrameBufferHardware(确定输出目标)

初始化:

OpenGLES

建立兼容的mainSurface.利用eglCreateWindowSurface。

建立OpenGLES进程上下文。

建立主Surface(OpenGLES)。

DisplayHardware的Init()@DisplayHardware.cpp函数对OpenGL做了初始化,并创建立主Surface。

为什么叫主Surface,因为所有的Layer在绘制时,都需要先绘制在这个主Surface上,最后系统才将主Surface的内容”投掷”到真正的屏幕上。

(3)主Surface的绑定

1)在DisplayHandware初始完毕后,hw.makeCurrent()将主Surface,OpenGLES进程上下文绑定到SurfaceFlinger的上下文中,

2)之后所有的SurfaceFlinger进程中使用EGL的所有的操作目的地都是mSurface@DisplayHardware。

这样,在OpenGL绘制图形时,主Surface被记录在进程的上下文中,所以看不到显示的主Surfce相关参数的传递。

下面是Layer-Draw,Hardware.flip的动作示意图:

4.2ThreadLoop

(1)handleTransaction(…):

主要计算每个Layer有无属性修改,如果有修改着内用需要重画。

(2)handlePageFlip()

computeVisibleRegions:

根据Z-Order序列计算每个Layer的可见区域和被覆盖区域。

裁剪输出范围计算-

在生成裁剪区域的时候,根据Z_order依次,每个Layer在计算自己在屏幕的可显示区域时,需要经历如下步骤:

1)以自己的W,H给出自己初始的可见区域

2)减去自己上面窗口所覆盖的区域

在绘制时,Layer将根据自己的可将区域做相应的区域数据Copy。

(3)handleRepaint()

composeSurfaces(需要刷新区域):

根据每个Layer的可见区域与需要刷新区域的交集区域从Z-Order序列从底部开始绘制到主Surface上。

(4)postFramebuffer()

(DisplayHardware)hw.flip(mInvalidRegion);

eglSwapBuffers(display,mSurface):

将mSruface投递到屏幕。

5总结

现在SurfaceFlinger干的事情利用下面的示意图表示出来:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1