77范文网 - 专业文章范例文档资料分享平台

Android的Graphic系统分析之skia(2)

来源:网络收集 时间:2020-04-16 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

mServerCblk = //得到内存基址

static_cast(mServerHeap->getBase());

LOGE_IF(mServerCblk==0, “can’t get to shared control block’s address”); new(mServerCblk) surface_flinger_cblk_t;

// initialize primary screen

// (other display should be initialized in the same manner, but // asynchronously, as they could come and go. None of this is supported yet).

const GraphicPlane& plane(graphicPlane(dpy)); const DisplayHardware& hw = plane.displayHardware(); const uint32_t w = hw.getWidth(); const uint32_t h = hw.getHeight(); const uint32_t f = hw.getFormat(); hw.makeCurrent();

// initialize the shared control block mServerCblk->connected |= 1<

display_cblk_t* dcblk = mServerCblk->displays + dpy; memset(dcblk, 0, sizeof(display_cblk_t)); //给结构体赋值,同一块内存上,client侧可以立即得到 dcblk->w = plane.getWidth(); dcblk->h = plane.getHeight(); dcblk->format = f;

dcblk->orientation = ISurfaceComposer::eOrientationDefault; dcblk->xdpi = hw.getDpiX(); dcblk->ydpi = hw.getDpiY(); dcblk->fps = hw.getRefreshRate(); dcblk->density = hw.getDensity();

IsurfaceComposerClient

ISurfaceComposerClient用于通过Binder与SurfaceFlinger交互,创建和销毁ISurface,它也可以获取控制块。在SurfaceFlinger侧会有两种类型的surface:Client(用于创建销毁ISurace)和UserClient(用于获取控制块进行通讯)。它提供的接口对应的枚举类型如下:

enum {

GET_CBLK = IBinder::FIRST_CALL_TRANSACTION, GET_TOKEN, CREATE_SURFACE, DESTROY_SURFACE, SET_STATE };

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

ISurface

Isurface提供了一个与SufaceFlinger侧进行IPC交互的接口,它主要功能是操作缓冲区。我们可以从ISurface这个纯虚类中看出起定义的接口操作:

enum {

REGISTER_BUFFERS = IBinder::FIRST_CALL_TRANSACTION, UNREGISTER_BUFFERS,

POST_BUFFER, // one-way transaction CREATE_OVERLAY, REQUEST_BUFFER,

SET_BUFFER_COUNT, };

这些枚举就是所支持的接口操作,相应地对应着纯虚成员函数。我们可以望文生义理解其含义。

如下图,BpSurface是client一侧, BnSurface是service一侧。它们都继承自各自的模板类BpInterface和BnInterface,这两个模板类完成双重继承的功能,一个继承IPC通讯的API接口,一个继承Binder功能。RefBase用于索引计数,类IInterface和ISurface定义了IPC通讯的接口API,IBinder/BBinder使双方具备Binder通讯功能。

类继承关系图

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

sp

Surface flinger制块

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

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

uint16_t w; //display的宽 uint16_t h; //display的高 uint8_t format; //格式

uint8_t orientation; //旋转方向 uint8_t reserved[2]; //保留字节 float fps; //刷新率 float density; //密度

float xdpi;//x方向上的解析度,每英寸的点阵数(dots/inch) float ydpi;//y方向上的解析度 uint32_t pad[2];//填充字节 };

struct surface_flinger_cblk_t // 4KB max {

uint8_t connected;//是否连接 uint8_t reserved[3];//保留字节 uint32_t pad[7];//填充字节

display_cblk_t displays[SharedBufferStack::NUM_DISPLAY_MAX];//支持最多4个的display };

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

void SurfaceComposerClient::onFirstRef()//第一次创建对象时被调用 {

sp sm(getComposerService());//导致获取全局控制块 if (sm != 0) {

sp conn = sm->createConnection();//创建一个连接,surface flinger侧会创建一个Client对象 if (conn != 0) { mClient = conn;

Composer::addClient(this);

mPrebuiltLayerState = new layer_state_t;

mStatus = NO_ERROR; } } }

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

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

ComposerService::ComposerService() : Singleton() { const String16 name(“SurfaceFlinger”);

while (getService(name, &mComposerService) != NO_ERROR) { usleep(250000); }

mServerCblkMemory = mComposerService->getCblk();//获取IMemoryHeap mServerCblk = static_cast( mServerCblkMemory->getBase());//在IMemoryHeap中的基址指针转换为surface_flinger_cblk_t指针 }

另外,SurfaceComposerClient的onFirstRef会创建一个connection,它的目的是创建代理对象,用于Binder IPC通讯,ISurfaceComposerClient接口强指针指向该代理对象。在server侧,它只是调用Client(也就是ISurfaceComposerClient接口在server侧的真正实现者)构造函数创建一个Client对象进行类型转换后返回。而实际的内存分配是在server侧创建SurfaceFlinger后准备运行其工作线程时完成的,见SurfaceFlinger::readyToRun函数:

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Android的Graphic系统分析之skia(2)在线全文阅读。

Android的Graphic系统分析之skia(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/974550.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: