Androird GDI之共享缓冲区机制
  1  native_handle_t对private_handle_t 的包裹     private_handle_t是gralloc.so使用的本地缓冲区私有的数据结构,而Native_handle_t是上层抽象的可以在进程间传递的数据结构。在客户端是如何还原所传递的数据结构呢?首先看看native_handle_t对private_handle_t的抽象包装。
                     

qw.jpg (24.35 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:06 上传

  numFds= sNumFds=1;
  numInts= sNumInts=8;
  这个是Parcel中描述句柄的抽象模式。实际上是指的Native_handle所指向句柄对象的具体内容:
  numFds=1表示有一个文件句柄:fd/
  numInts= 8表示后面跟了8个INT型的数据:magic,flags,size,offset,base,lockState,writeOwner,pid;
  由于在上层系统不要关心buffer_handle_t中data的具体内容。在进程间传递buffer_handle_t(native_handle_t)句柄是其实是将这个句柄内容传递到Client端。在客户端通过Binder读取readNativeHandle @Parcel.cpp新生成一个native_handle。
  native_handle* Parcel::readNativeHandle() const
  {
  …
  native_handle* h = native_handle_create(numFds, numInts);
  for (int i=0 ; err==NO_ERROR && idata = dup(readFileDescriptor());
  if (h->data < 0) err = BAD_VALUE;
  }
  err = read(h->data + numFds, sizeof(int)*numInts);
  …。
  return h;
  }
  这里需要提到的是为在构造客户端的native_handle时,对于对方传递过来的文件句柄的处理。由于不是在同一个进程中,所以需要dup(…)一下为客户端使用。这样就将Native_handle句柄中的,客户端感兴趣的从服务端复制过来。这样就将Private_native_t的数据:magic,flags,size,offset,base,lockState,writeOwner,pid;复制到了客户端。
  客户端利用这个新的Native_buffer被Mapper传回到gralloc.xxx.so中,获取到native_handle关联的共享缓冲区映射地址,从而获取到了该缓冲区的控制权,达到了客服端和Server间的内存共享。从SurfaceFlinger来看就是作图区域的共享。
  2 Graphic Mapper是干什么的?    服务端(SurfaceFlinger)分配了一段内存作为Surface的作图缓冲,客户端怎样在这个作图缓冲区上工作呢?这个就是Mapper(GraphicBufferMapper)y要干的事情。两个进程间如何共享内存,如何获取到共享内存?Mapper就是干这个得。需要利用到两个信息:共享缓冲区设备句柄,分配时的偏移量。Mapper利用这样的原理:
  客户端只有lock,unlock,实质上就是mmap和ummap的操作。对于同样一个共享缓冲区,偏移量才是总要的,起始地址不重要。实际上他们操作了同一物理地址的内存块。我们在上面讨论了native_handle_t对private_handle_t 的包裹过程,从中知道服务端给客户端传递了什么东西。
  进程1在共享内存设备上预分配了8M的内存。以后所有的分配都是在这个8M的空间进行。对以该文件设备来讲,8M物理内存提交后,就实实在在的占用了8M内存。每个每个进程都可以同个该内存设备共享该8M的内存,他们使用的工具就会mmap。由于在mmap都是用0开始获取映射地址,所以所有的客户端进程都是有了同一个物理其实地址,所以此时偏移量和size就可以标识一段内存。而这个偏移量和size是个数值,从服务进程传递到客户端直接就可以使用。
                    

er.jpg (30.31 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:07 上传

  3 GraphicBuffer(缓冲区代理对象)
  typedef struct android_native_buffer_t
  {
  struct android_native_base_t common;
  int width;
  int height;
  int stride;
  int format;
  int usage;
  …
  buffer_handle_t handle;
  …
  } android_native_buffer_t;
  关系图表:
  GraphicBuffer :EGLNativeBase :android_native_buffer_t
  GraphicBuffer(parcel &)建立本地的GraphicBuffer的数据native_buffer_t。在通过接收对方的传递的native_buffer_t 构建GraphicBuffer。我们来看看在客户端Surface::lock获取操作缓冲区的函数调用:
  Surface::lock(SurfaceInfo* other, Region* dirtyIn, bool blocking)
  {int Surface::dequeueBuffer(android_native_buffer_t** buffer)(Surface)
  {status_t Surface::getBufferLocked(int index, int usage)
  {
  sp buffer = s->requestBuffer(index, usage);
  {
  virtual sp requestBuffer(int bufferIdx, int usage)
  {   remote()->transact(REQUEST_BUFFER, data, &reply);
  sp buffer = new GraphicBuffer(reply);
  Surface::Lock建立一个在Client端建立了一个新的GraphicBuffer 对象,该对象通过(1)描述的原理将SurfaceFlinger的buffer_handle_t相关数据构成新的客户端buffer_handle_t数据。在客户端的Surface对象就可以使用GraphicMapper对客户端buffer_handle_t进行mmap从而获取到共享缓冲区的开始地址了。
  4 总结
  Android在该节使用了共享内存的方式来管理与显示相关的缓冲区,他设计成了两层,上层是缓冲区管理的代理机构GraphicBuffer,及其相关的native_buffer_t,下层是具体的缓冲区的分配管理及其缓冲区本身。上层的对象是可以在经常间通过Binder传递的,而在进程间并不是传递缓冲区本身,而是使用mmap来获取指向共同物理内存的映射地址。

转载于:https://www.cnblogs.com/kingshow123/p/androidcore25.html

Android核心分析之二十五Android GDI之共享缓冲区机制相关推荐

  1. Android核心分析之二十二Android应用框架之Activity

    3 Activity设计框架 3.1 外特性空间的Activity    我们先来看看,android应用开发人员接触的外特性空间中的Activity,对于AMS来讲,这个Activity就是客服端的 ...

  2. [转]Android核心分析之二:方法论探讨之概念空间篇

    我们潜意识就不想用计算机的方式来思考问题,我们有自己的思维描述方式,越是接近我们思维描述方式,我们越容易接受和使用.各种计算机语言,建模工具,不外乎就是建立一个更接近人的思维方式的概念空间,再使用工具 ...

  3. Android进阶知识(二十五):Bitmap简介及其高效加载

    Android进阶知识(二十五):Bitmap简介及其高效加载 一.Bitmap   Bitmap代表一个位图,在Android中指的是一张图片,可以是png.jpg等格式的图片.BitmapDraw ...

  4. osgEarth的Rex引擎原理分析(二十五)地形瓦片大小尺寸和LOD的关系

    目标:(十八)中的问题55 osgEarth::TerrainOption中_tileSize默认大小为17,LOD的默认范围为0-23,这两个值的关系是什么? 还有瓦片的像素尺寸_tilePixel ...

  5. Android核心分析之二十三Andoird GDI之基本原理及其总体框架

     Android GDI基本框架 在Android中所涉及的概念和代码最多,最繁杂的就是GDI相关的代码了.但是本质从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理. GDI主 ...

  6. Android开发笔记(二十五)assets目录下的文件读取

    AssetManager工具类 assets目录用于存放应用程序的资产文件,该目录下的文件不会被系统编译,所以无法通过R.*.*这种方式来访问.Android专门为assets目录提供了一个工具类As ...

  7. Android开发-自定义View-AndroidStudio(二十五)数独(2)Handler延迟

    转载请注明出处: http://blog.csdn.net/iwanghang/article/details/54138268 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 老规矩,先上GIF动态 ...

  8. Android核心分析之二十七Android GDI 之SurfaceFlinger之动态结构示

           SurfaceFlinger对象建立过程示意 1 SurfaceSession的建立 客户端请求建立Surface时,首先在要与SurfaceFlinger建立一个Session,然后再 ...

  9. Android手机开发总结——Android核心分析

    导读:对于Android开发者来说,成系列的技术文章对他们的技术成长帮助最大.如下是我们向您强烈推荐的主题为Android开发的第一个系列文章. <Android核心分析>整理如下: 1. ...

  10. Andriod开发之二十:Android开发笔记(序)写在前面的目录

    https://blog.csdn.net/aqi00/article/details/50038385 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教 ...

最新文章

  1. android位置传感器
  2. Eclipse常见问题集锦
  3. 当当大促的额外优惠来啦!160 买 400的书!搓搓搓~
  4. 使用Tesseract-OCR训练文字识别记录
  5. matlab中tic,toc的用法
  6. java 映射类_将数据库类型映射到具体的Java类
  7. orcle rac启动了,但数据库没有启动的错误解决
  8. HTTP深入浅出个人总结
  9. 有序数组中查找第一个比target大的数
  10. Y2161 Hibernate第三次考试 2016年8月18日 试卷分析
  11. 只允许选中三级选择框的方法
  12. Eclipse环境下配置Tomcat
  13. 错位排列递推公式推导
  14. php网站登录界面验证码打不开,php网站无法显示验证码
  15. 时区是怎么划分的?世界各时区的时间如何统一表达?GMT、UTC、UNIX有什么区别?
  16. MSTAR数据集处理
  17. Alpha 测试(α测试) Beta 测试(β测试)区别
  18. 两个月面试30+公司,我得到了这些经验教训
  19. java中竖线怎么画_java split | (竖线)
  20. 不动产登记工作统计难 要靠三维不动产管理系统

热门文章

  1. Python使用requests发送post请求
  2. 调用目标检测百度接口api
  3. DeepFake技术--DeepFake克星来了,简单两步算法造假图像无处可逃
  4. 从零开始实现Adam优化算法
  5. 序列标注模型结果评估模块seqeval学习使用
  6. 修改linux文件权限命令:chmod超级详细讲解
  7. C++ std::map sort 如何按值排序 自定义比较函数 比较对象某个字段
  8. git The requested URL returned error: 403
  9. thinkphp判断本地环境是否为SAE
  10. Linux 挂载华为存储,linux扫描挂载存储