欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:22775798       资源大小:22.28KB        全文页数:16页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    1、 show/hide: 显示隐藏操作 setSize/setPosition: 设置大小和位置 SetLayer:设置图层 freeze/unfreeze:冻结与去冻结操作,即是否更新屏幕 SetAlpha:设置Alpha通道,即设置透明等级 SetMatrix:设置平移矩阵 setFlags:设置其它标志 这些SurfaceControl类的功能实现仅仅是对SurfaceComposerClient的简单封装。可以通过SurfaceComposerClient的函数获取Display的个数、高、宽、旋转方向以及其它信息。它是通过ComposerService中的控制块信息来实现的。Scree

    2、nshotClient包含屏幕截屏宽(mWidth)和高(mHeight)以及像素格式(PixelFormat),截图数据保存在IMemoryHeap中(mHeap)。它是调用ISurfaceComposer的captureScreen函数来实现的。SurfaceSurface类继承自EGLNativeBase模板类,因此它实际上一个ANativeWindow,只不过该模板给它添加了引用计数功能,并可安全地进行类型转换。class Surface: public EGLNativeBase上层应用程序各有自己的surface,因此多个surface会同时存在,这些surface在本侧就是Sur

    3、faceComposerClient所代表,它们可以添加到Composer类维护的列表中。SurfaceControl会使用SurfaceClient和Surface去完成相应功能,SurfaceControl的getSurface函数会创建Surface,从而也会导致SurfaceClient的创建,进而相应的ISurfaceClientComposer等会被创建。ISurfaceComposerISurfaceComposer是SurfaceFlinger在client侧的一个binder,提供的接口用于对整个屏幕的全局性的管理,如方向旋转、屏幕快照、屏幕事件、屏幕更新的冻结与去冻结等。它

    4、提供的接口对应的枚举类型有:enum / Note: BOOT_FINISHED must remain this value, it is called from/ Java by ActivityManagerService.BOOT_FINISHED = IBinder:FIRST_CALL_TRANSACTION,CREATE_CONNECTION,CREATE_CLIENT_CONNECTION,GET_CBLK,OPEN_GLOBAL_TRANSACTION,CLOSE_GLOBAL_TRANSACTION,SET_ORIENTATION,FREEZE_DISPLAY,UNFREE

    5、ZE_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

    6、使双方具备Binder通讯功能。其中CREATE_CONNECTION和REATE_CLIENT_CONNECTION打开关闭一个Transaction,在打开和关闭的过程中,可以设置状态,实现窗口管理。状态变化更改是在一个事务(transaction)中进行的。其类继承关系如下:根据Binder继承关系规则,client侧的接口调用通过最终是由Bn侧的子类完成。我们就可以知道它的它动态的调用关系如下,左侧的调用者一般可以通过指向ISurfaceComposer的智能指针将操作将调用到SurfaceFlinger类的成员函数。ComposerService对IsurfaceComposer进行

    7、了包裹,使用它的getComposerService函数可以获取IsurfaceComposer。另外,ComposerService还包含了surface_flinger_cblk_t控制块信息,该内存块位于Ashem内存上,由SurfaceFlinger申请,并依据display硬件信息填充字段值。client端程序通过读取它,即可得到各display的信息。struct display_cblk_t/dispaly的各项信息uint16_t w;uint16_t h;uint8_t format;uint8_t orientation;uint8_t reserved2;float fp

    8、s;float density;float xdpi;float ydpi;uint32_t pad2;struct surface_flinger_cblk_t / 4KB max/控制信息块uint8_t connected;uint8_t reserved3;uint32_t pad7;display_cblk_t displaysSharedBufferStack:NUM_DISPLAY_MAX;/最多4个display在SufraceFlinger的readyToRun会申请内存,并依据DisplayHardWare中得到display信息:/ create the shared c

    9、ontrol-blockmServerHeap = new MemoryHeapBase(4096,MemoryHeapBase:READ_ONLY, “SurfaceFlinger read-only heap”);/分配内存,没有指定设备名称或描述符fd,默认使用AShem上的内存LOGE_IF(mServerHeap=0, “cant create shared memory dealer”);mServerCblk = /得到内存基址static_cast(mServerHeap-getBase();LOGE_IF(mServerCblk=0, “cant get to shared

    10、control blocks 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

    11、 = 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 blockmServerCblk-connected |= 1displays + dpy;memset(dcblk, 0, sizeof(display_cblk_t);/给结构体赋值,同一块内存上,client侧可以立即得到dcblk-w =

    12、 plane.getWidth();h = plane.getHeight();format = f;orientation = ISurfaceComposer:eOrientationDefault;xdpi = hw.getDpiX();ydpi = hw.getDpiY();fps = hw.getRefreshRate();density = hw.getDensity();IsurfaceComposerClientISurfaceComposerClient用于通过Binder与SurfaceFlinger交互,创建和销毁ISurface,它也可以获取控制块。在SurfaceFl

    13、inger侧会有两种类型的surface:Client(用于创建销毁ISurace)和UserClient(用于获取控制块进行通讯)。它提供的接口对应的枚举类型如下:GET_CBLK = IBinder:GET_TOKEN,CREATE_SURFACE,DESTROY_SURFACE,SET_STATE动态调用关系图,调用者通过对IsurfaceComposerClient的引用,最后由SufaceFlinger进程中的Client或UserClient来完成:ISurfaceIsurface提供了一个与SufaceFlinger侧进行IPC交互的接口,它主要功能是操作缓冲区。我们可以从ISu

    14、rface这个纯虚类中看出起定义的接口操作:REGISTER_BUFFERS = IBinder:UNREGISTER_BUFFERS,POST_BUFFER, / one-way transactionCREATE_OVERLAY,REQUEST_BUFFER,SET_BUFFER_COUNT,这些枚举就是所支持的接口操作,相应地对应着纯虚成员函数。我们可以望文生义理解其含义。如下图,BpSurface是client一侧, BnSurface是service一侧。类继承关系图动态调用关系如下图所示:spSurface flinger制块在文件SharedBufferStack.h中定义了一个

    15、结构体,它是为了通过共享内存的方式快速获取系统所有display物理信息,这个控制块由结构体surface_flinger_cblk_t定义:struct display_cblk_t/显示控制块,Android中默认支持最多4个diaplay /display的宽 /display的高 /格式 /旋转方向 /保留字节 /刷新率 /密度/x方向上的解析度,每英寸的点阵数(dots/inch)/y方向上的解析度/填充字节/是否连接/保留字节/支持最多4个的displayJava层在创建一个SurfaceSession实例时,建立到server侧的连接,这个连接的动作实际就是分配内存、创建surf

    16、ace_flinger_cblk_t对象并初始化获得初始值、以及可以跨进程访问的过程。具体过程是:在client一侧,创建Surface Session时,会创建一个SurfaceComposerClient对象,接着会调用SurfaceComposerClient:onFirstRef:void SurfaceComposerClient:onFirstRef()/第一次创建对象时被调用ISurfaceComposer sm(getComposerService();/导致获取全局控制块if (sm != 0) ISurfaceComposerClient conn = sm-createC

    17、onnection();/创建一个连接,surface flinger侧会创建一个Client对象if (conn !mClient = conn;Composer:addClient(this);mPrebuiltLayerState = new layer_state_t;mStatus = NO_ERROR;在上面的代码中,先在ComposerService的构造函数中获取surface flinger控制块。ComposerService(也就是ISurfaceComposer的Wrapper)构造函数获取surface flinger控制块的过程如下:ComposerService:

    18、ComposerService() Singleton() const String16 name(“SurfaceFlinger”);while (getService(name, &mComposerService) != NO_ERROR) usleep(250000);mServerCblkMemory = mComposerService-getCblk();/获取IMemoryHeapmServerCblk = static_cast(mServerCblkMemory-/在IMemoryHeap中的基址指针转换为surface_flinger_cblk_t指针另外,Surface

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

    20、Run()LOGI( “SurfaceFlingers main thread ready to run. ”“Initializing graphics H/W”);/ we only support one display currentlyint dpy = 0;/ initialize the main displayGraphicPlane&DisplayHardware* const hw = new DisplayHardware(this, dpy);plane.setDisplayHardware(hw);/创建共享控制块,因未指定在何处分配内存,默认的是ashmem上 (mServerHeap-/获取基址/ (other display should be initialized in the same manner, but/ asynchronously, as they could come and go. None of this is supported yet)./下面是为共享控制块赋值/省略部分代码它为该控制块在ashmem上分配内存并对其初始化赋值。SharedClient控制块


    注意事项

    本文(Android的Graphic系统分析之skia讲解学习Word文档下载推荐.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开