Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx

上传人:b****7 文档编号:22775798 上传时间:2023-02-05 格式:DOCX 页数:16 大小:22.28KB
下载 相关 举报
Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx_第1页
第1页 / 共16页
Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx_第2页
第2页 / 共16页
Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx_第3页
第3页 / 共16页
Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx_第4页
第4页 / 共16页
Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx

《Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。

Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx

∙show/hide:

显示隐藏操作

∙setSize/setPosition:

设置大小和位置

∙SetLayer:

设置图层

∙freeze/unfreeze:

冻结与去冻结操作,即是否更新屏幕

∙SetAlpha:

设置Alpha通道,即设置透明等级

∙SetMatrix:

设置平移矩阵

∙setFlags:

设置其它标志

这些SurfaceControl类的功能实现仅仅是对SurfaceComposerClient的简单封装。

可以通过SurfaceComposerClient的函数获取Display的个数、高、宽、旋转方向以及其它信息。

它是通过ComposerService中的控制块信息来实现的。

ScreenshotClient包含屏幕截屏宽(mWidth)和高(mHeight)以及像素格式(PixelFormat),截图数据保存在IMemoryHeap中(mHeap)。

它是调用ISurfaceComposer的captureScreen函数来实现的。

Surface

Surface类继承自EGLNativeBase模板类,因此它实际上一个ANativeWindow,只不过该模板给它添加了引用计数功能,并可安全地进行类型转换。

classSurface

:

publicEGLNativeBase<

ANativeWindow,Surface,RefBase>

上层应用程序各有自己的surface,因此多个surface会同时存在,这些surface在本侧就是SurfaceComposerClient所代表,它们可以添加到Composer类维护的列表中。

SurfaceControl会使用SurfaceClient和Surface去完成相应功能,SurfaceControl的getSurface函数会创建Surface,从而也会导致SurfaceClient的创建,进而相应的ISurfaceClientComposer等会被创建。

ISurfaceComposer

ISurfaceComposer是SurfaceFlinger在client侧的一个binder,提供的接口用于对整个屏幕的全局性的管理,如方向旋转、屏幕快照、屏幕事件、屏幕更新的冻结与去冻结等。

它提供的接口对应的枚举类型有:

enum{

//Note:

BOOT_FINISHEDmustremainthisvalue,itiscalledfrom

//JavabyActivityManagerService.

BOOT_FINISHED=IBinder:

FIRST_CALL_TRANSACTION,

CREATE_CONNECTION,

CREATE_CLIENT_CONNECTION,

GET_CBLK,

OPEN_GLOBAL_TRANSACTION,

CLOSE_GLOBAL_TRANSACTION,

SET_ORIENTATION,

FREEZE_DISPLAY,

UNFREEZE_DISPLAY,

SIGNAL,

CAPTURE_SCREEN,

TURN_ELECTRON_BEAM_OFF,

TURN_ELECTRON_BEAM_ON

};

它是通过Binder进行IPC通讯的接口,BpSurfaceComposer是client一侧,BnSurfaceComposer是service一侧。

它们都继承自各自的模板类BpInterface和BnInterface,这两个模板类完成双重继承的功能,一个继承IPC通讯的API接口,一个继承Binder功能。

RefBase用于索引计数,类IInterface和ISurface定义了IPC通讯的接口API,IBinder/BBinder使双方具备Binder通讯功能。

其中CREATE_CONNECTION和REATE_CLIENT_CONNECTION打开关闭一个Transaction,在打开和关闭的过程中,可以设置状态,实现窗口管理。

状态变化更改是在一个事务(transaction)中进行的。

其类继承关系如下:

根据Binder继承关系规则,client侧的接口调用通过最终是由Bn侧的子类完成。

我们就可以知道它的它动态的调用关系如下,左侧的调用者一般可以通过指向ISurfaceComposer的智能指针将操作将调用到SurfaceFlinger类的成员函数。

ComposerService对IsurfaceComposer进行了包裹,使用它的getComposerService函数可以获取IsurfaceComposer。

另外,ComposerService还包含了surface_flinger_cblk_t控制块信息,该内存块位于Ashem内存上,由SurfaceFlinger申请,并依据display硬件信息填充字段值。

client端程序通过读取它,即可得到各display的信息。

structdisplay_cblk_t

{//dispaly的各项信息

uint16_tw;

uint16_th;

uint8_tformat;

uint8_torientation;

uint8_treserved[2];

floatfps;

floatdensity;

floatxdpi;

floatydpi;

uint32_tpad[2];

structsurface_flinger_cblk_t//4KBmax

{//控制信息块

uint8_tconnected;

uint8_treserved[3];

uint32_tpad[7];

display_cblk_tdisplays[SharedBufferStack:

NUM_DISPLAY_MAX];

//最多4个display

在SufraceFlinger的readyToRun会申请内存,并依据DisplayHardWare中得到display信息:

//createthesharedcontrol-block

mServerHeap=newMemoryHeapBase(4096,

MemoryHeapBase:

READ_ONLY,“SurfaceFlingerread-onlyheap”);

//分配内存,没有指定设备名称或描述符fd,默认使用AShem上的内存

LOGE_IF(mServerHeap==0,“can’tcreatesharedmemorydealer”);

mServerCblk=//得到内存基址

static_cast<

surface_flinger_cblk_t*>

(mServerHeap->

getBase());

LOGE_IF(mServerCblk==0,“can’tgettosharedcontrolblock’saddress”);

new(mServerCblk)surface_flinger_cblk_t;

//initializeprimaryscreen

//(otherdisplayshouldbeinitializedinthesamemanner,but//asynchronously,astheycouldcomeandgo.Noneofthisissupportedyet).

constGraphicPlane&

plane(graphicPlane(dpy));

constDisplayHardware&

hw=plane.displayHardware();

constuint32_tw=hw.getWidth();

constuint32_th=hw.getHeight();

constuint32_tf=hw.getFormat();

hw.makeCurrent();

//initializethesharedcontrolblock

mServerCblk->

connected|=1<

<

dpy;

display_cblk_t*dcblk=mServerCblk->

displays+dpy;

memset(dcblk,0,sizeof(display_cblk_t));

//给结构体赋值,同一块内存上,client侧可以立即得到

dcblk->

w=plane.getWidth();

h=plane.getHeight();

format=f;

orientation=ISurfaceComposer:

eOrientationDefault;

xdpi=hw.getDpiX();

ydpi=hw.getDpiY();

fps=hw.getRefreshRate();

density=hw.getDensity();

IsurfaceComposerClient

ISurfaceComposerClient用于通过Binder与SurfaceFlinger交互,创建和销毁ISurface,它也可以获取控制块。

在SurfaceFlinger侧会有两种类型的surface:

Client(用于创建销毁ISurace)和UserClient(用于获取控制块进行通讯)。

它提供的接口对应的枚举类型如下:

GET_CBLK=IBinder:

GET_TOKEN,

CREATE_SURFACE,

DESTROY_SURFACE,

SET_STATE

动态调用关系图,调用者通过对IsurfaceComposerClient的引用,最后由SufaceFlinger进程中的Client或UserClient来完成:

ISurface

Isurface提供了一个与SufaceFlinger侧进行IPC交互的接口,它主要功能是操作缓冲区。

我们可以从ISurface这个纯虚类中看出起定义的接口操作:

REGISTER_BUFFERS=IBinder:

UNREGISTER_BUFFERS,

POST_BUFFER,//one-waytransaction

CREATE_OVERLAY,

REQUEST_BUFFER,

SET_BUFFER_COUNT,

这些枚举就是所支持的接口操作,相应地对应着纯虚成员函数。

我们可以望文生义理解其含义。

如下图,BpSurface是client一侧,BnSurface是service一侧。

类继承关系图

动态调用关系如下图所示:

sp<

Isurface>

Surfaceflinger制块

在文件SharedBufferStack.h中定义了一个结构体,它是为了通过共享内存的方式快速获取系统所有display物理信息,这个控制块由结构体surface_flinger_cblk_t定义:

structdisplay_cblk_t//显示控制块,Android中默认支持最多4个diaplay

{

//display的宽

//display的高

//格式

//旋转方向

//保留字节

//刷新率

//密度

//x方向上的解析度,每英寸的点阵数(dots/inch)

//y方向上的解析度

//填充字节

//是否连接

//保留字节

//支持最多4个的display

Java层在创建一个SurfaceSession实例时,建立到server侧的连接,这个连接的动作实际就是分配内存、创建surface_flinger_cblk_t对象并初始化获得初始值、以及可以跨进程访问的过程。

具体过程是:

在client一侧,创建SurfaceSession时,会创建一个SurfaceComposerClient对象,接着会调用SurfaceComposerClient:

onFirstRef:

voidSurfaceComposerClient:

onFirstRef()//第一次创建对象时被调用

ISurfaceComposer>

sm(getComposerService());

//导致获取全局控制块

if(sm!

=0){

ISurfaceComposerClient>

conn=sm->

createConnection();

//创建一个连接,surfaceflinger侧会创建一个Client对象

if(conn!

mClient=conn;

Composer:

addClient(this);

mPrebuiltLayerState=newlayer_state_t;

mStatus=NO_ERROR;

}

在上面的代码中,先在ComposerService的构造函数中获取surfaceflinger控制块。

ComposerService(也就是ISurfaceComposer的Wrapper)构造函数获取surfaceflinger控制块的过程如下:

ComposerService:

ComposerService()

Singleton<

ComposerService>

(){

constString16name(“SurfaceFlinger”);

while(getService(name,&

mComposerService)!

=NO_ERROR){

usleep(250000);

mServerCblkMemory=mComposerService->

getCblk();

//获取IMemoryHeap

mServerCblk=static_cast<

surface_flinger_cblk_tvolatile*>

mServerCblkMemory->

//在IMemoryHeap中的基址指针转换为surface_flinger_cblk_t指针

另外,SurfaceComposerClient的onFirstRef会创建一个connection,它的目的是创建代理对象,用于BinderIPC通讯,ISurfaceComposerClient接口强指针指向该代理对象。

在server侧,它只是调用Client(也就是ISurfaceComposerClient接口在server侧的真正实现者)构造函数创建一个Client对象进行类型转换后返回。

而实际的内存分配是在server侧创建SurfaceFlinger后准备运行其工作线程时完成的,见SurfaceFlinger:

readyToRun函数:

status_tSurfaceFlinger:

readyToRun()

LOGI(“SurfaceFlinger’smainthreadreadytorun.”

“InitializinggraphicsH/W…”);

//weonlysupportonedisplaycurrently

intdpy=0;

//initializethemaindisplay

GraphicPlane&

DisplayHardware*consthw=newDisplayHardware(this,dpy);

plane.setDisplayHardware(hw);

//创建共享控制块,因未指定在何处分配内存,默认的是ashmem上

(mServerHeap->

//获取基址

//(otherdisplayshouldbeinitializedinthesamemanner,but

//asynchronously,astheycouldcomeandgo.Noneofthisissupportedyet).

//下面是为共享控制块赋值

……//省略部分代码

它为该控制块在ashmem上分配内存并对其初始化赋值。

SharedClient控制块

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

当前位置:首页 > 高等教育 > 文学

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

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