Android核心分析之二十五Android GDI之共享缓冲区机制
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之共享缓冲区机制相关推荐
- Android核心分析之二十二Android应用框架之Activity
3 Activity设计框架 3.1 外特性空间的Activity 我们先来看看,android应用开发人员接触的外特性空间中的Activity,对于AMS来讲,这个Activity就是客服端的 ...
- [转]Android核心分析之二:方法论探讨之概念空间篇
我们潜意识就不想用计算机的方式来思考问题,我们有自己的思维描述方式,越是接近我们思维描述方式,我们越容易接受和使用.各种计算机语言,建模工具,不外乎就是建立一个更接近人的思维方式的概念空间,再使用工具 ...
- Android进阶知识(二十五):Bitmap简介及其高效加载
Android进阶知识(二十五):Bitmap简介及其高效加载 一.Bitmap Bitmap代表一个位图,在Android中指的是一张图片,可以是png.jpg等格式的图片.BitmapDraw ...
- osgEarth的Rex引擎原理分析(二十五)地形瓦片大小尺寸和LOD的关系
目标:(十八)中的问题55 osgEarth::TerrainOption中_tileSize默认大小为17,LOD的默认范围为0-23,这两个值的关系是什么? 还有瓦片的像素尺寸_tilePixel ...
- Android核心分析之二十三Andoird GDI之基本原理及其总体框架
Android GDI基本框架 在Android中所涉及的概念和代码最多,最繁杂的就是GDI相关的代码了.但是本质从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理. GDI主 ...
- Android开发笔记(二十五)assets目录下的文件读取
AssetManager工具类 assets目录用于存放应用程序的资产文件,该目录下的文件不会被系统编译,所以无法通过R.*.*这种方式来访问.Android专门为assets目录提供了一个工具类As ...
- Android开发-自定义View-AndroidStudio(二十五)数独(2)Handler延迟
转载请注明出处: http://blog.csdn.net/iwanghang/article/details/54138268 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 老规矩,先上GIF动态 ...
- Android核心分析之二十七Android GDI 之SurfaceFlinger之动态结构示
SurfaceFlinger对象建立过程示意 1 SurfaceSession的建立 客户端请求建立Surface时,首先在要与SurfaceFlinger建立一个Session,然后再 ...
- Android手机开发总结——Android核心分析
导读:对于Android开发者来说,成系列的技术文章对他们的技术成长帮助最大.如下是我们向您强烈推荐的主题为Android开发的第一个系列文章. <Android核心分析>整理如下: 1. ...
- Andriod开发之二十:Android开发笔记(序)写在前面的目录
https://blog.csdn.net/aqi00/article/details/50038385 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教 ...
最新文章
- android位置传感器
- Eclipse常见问题集锦
- 当当大促的额外优惠来啦!160 买 400的书!搓搓搓~
- 使用Tesseract-OCR训练文字识别记录
- matlab中tic,toc的用法
- java 映射类_将数据库类型映射到具体的Java类
- orcle rac启动了,但数据库没有启动的错误解决
- HTTP深入浅出个人总结
- 有序数组中查找第一个比target大的数
- Y2161 Hibernate第三次考试 2016年8月18日 试卷分析
- 只允许选中三级选择框的方法
- Eclipse环境下配置Tomcat
- 错位排列递推公式推导
- php网站登录界面验证码打不开,php网站无法显示验证码
- 时区是怎么划分的?世界各时区的时间如何统一表达?GMT、UTC、UNIX有什么区别?
- MSTAR数据集处理
- Alpha 测试(α测试) Beta 测试(β测试)区别
- 两个月面试30+公司,我得到了这些经验教训
- java中竖线怎么画_java split | (竖线)
- 不动产登记工作统计难 要靠三维不动产管理系统
热门文章
- Python使用requests发送post请求
- 调用目标检测百度接口api
- DeepFake技术--DeepFake克星来了,简单两步算法造假图像无处可逃
- 从零开始实现Adam优化算法
- 序列标注模型结果评估模块seqeval学习使用
- 修改linux文件权限命令:chmod超级详细讲解
- C++ std::map sort 如何按值排序 自定义比较函数 比较对象某个字段
- git The requested URL returned error: 403
- thinkphp判断本地环境是否为SAE
- Linux 挂载华为存储,linux扫描挂载存储