surfaceflinger中的显示内存管理类--GraphicBuffer

http://blog.youkuaiyun.com/DroidPhone/archive/2010/09/17/5891786.aspx

1.  Android中的应用层每申请一个Surface,最终会通过jni和binder调用到surfaceflinger中,最终会创建一个Layerxxx(Layer,LayerBuffer,LayerBlur,LayerDim)类,最通常的是Layer类,在Layer类中有一个成员变量:

            sp<GraphicBuffer> mBuffers[NUM_BUFFERS];

Layer的成员函数SetBuffers()初始化了该数组:

 

  1. for (size_t i=0 ; i<NUM_BUFFERS ; i++) {   
  2.     mBuffers[i] = new GraphicBuffer();   
  3. }  

 

其中,NUM_BUFFERS的定义是2,也就是说,android为每个Layer分配了两个显示缓冲,以便于做出PageFlip的动作。

2.  GraphicBuffer作为显示内存的管理类,负责显示内存的申请和释放。

分配和释放显存有辅助类GraphicBufferAllocator完成,lock和unlock则是由辅助类GraphicBufferMapper来完成。这两个辅助类都会调用HAL层的模块gralloc来完成和底层驱动程序的交互。

<think>好的,我现在要解决用户关于GraphicBuffer和AHardwareBuffer在Android图形编程中的区别及使用场景的问题。首先,我需要仔细分析用户提供的引用内容,理解其中的关键点,然后结合自己的知识进行整理和补充。 根据引用[3],AHardwareBuffer是一个类似于void类型的空结构体,它没有具体的类型,而Android NDK提供的接口实际上是将AHardwareBuffer转换为GraphicBuffer来调用相应的方法。这说明AHardwareBuffer更像是一个通用的句柄,用于跨层传递,而具体的实现由GraphicBuffer完成。引用[1]中的代码示例进一步验证了这一点,通过类型转换直接将AHardwareBuffer指针转为GraphicBuffer指针,说明它们在底层是同一对象的不同表现形式。 接下来,引用[2]提到GraphicBufferAllocator和GraphicBufferMapper是处理图形缓冲区的核心组件,负责分配和映射,而GraphicBuffer类封装和管理这些图形数据。这表明GraphicBufferAndroid图形子系统中扮演着更底层的角色,直接管理缓冲区的生命周期和操作。 引用[4]讨论的是多屏显示GraphicBuffer的数量配置,说明GraphicBuffer在系统级的资源管理中非常重要,需要根据硬件配置进行调整。而AHardwareBuffer作为NDK接口的一部分,可能更多用于应用层与底层之间的交互,提供跨平台的兼容性。 现在需要将两者的区别归纳出来,包括类型定义、API层级、使用场景、内存管理等方面。同时,使用场景部分需要明确何时选择哪一个,比如NDK开发用AHardwareBuffer,而系统内部或自定义功能用GraphicBuffer。 需要注意的是,用户的问题可能涉及到性能考量、兼容性以及版本差异。例如,AHardwareBuffer是在Android 8.0引入的,而GraphicBuffer可能更早存在。此外,在跨进程共享或硬件加速场景下,两者的处理方式可能不同,这些都需要在回答中提及。 最后,生成的相关问题需要涵盖内存管理、转换方法、多进程共享、性能优化以及版本兼容性,这些都是用户可能进一步感兴趣的方面。需要确保引用正确,比如引用[3]解释了类型转换,引用[1]提供了转换代码示例,引用[2]和[4]涉及到底层管理和配置。</think>### GraphicBuffer与AHardwareBuffer的区别及使用场景 #### 1. **类型定义与层级关系** - **GraphicBuffer**:是Android图形子系统中的核心类,直接管理图形缓冲区(如分配、映射、格式转换)。它属于Android Framework层的实现,与`GraphicBufferAllocator`和`GraphicBufferMapper`深度绑定[^2]。 - **AHardwareBuffer**:是Android NDK提供的抽象句柄(类似`void*`),用于跨层传递图形缓冲区。其底层实现本质上是对`GraphicBuffer`的封装[^3]。 #### 2. **API层级差异** - **GraphicBuffer**:面向系统开发者(如SurfaceFlinger、Hal层),需依赖Android源码环境,可直接操作缓冲区的像素数据、同步机制等。 - **AHardwareBuffer**:通过NDK接口(如`AHardwareBuffer_*`系列函数)对外暴露,适用于跨平台兼容性要求高的场景(如Vulkan、OpenGL ES交互)[^3]。 #### 3. **内存管理方式** - **GraphicBuffer**:由`GraphicBufferAllocator`直接分配内存,支持精细化控制(如配置`max_frame_buffer_acquired_buffers`限制缓冲区数量[^4])。 - **AHardwareBuffer**:通过`AHardwareBuffer_allocate`分配,实际调用`GraphicBuffer::create()`实现,但屏蔽了底层细节。 #### 4. **典型使用场景** - **GraphicBuffer适用场景**: - 系统服务(如SurfaceFlinger合成) - 需要直接操作像素数据的自定义渲染管线 - 多屏异显/同显的缓冲区配置优化 - **AHardwareBuffer适用场景**: - NDK原生层开发(如Camera2、MediaCodec交互) - 跨API图形库交互(如Vulkan与OpenGL共享纹理) - 需要兼容不同Android版本的基础图形操作 #### 5. **转换关系** 两者可通过类型强制转换直接互转: ```cpp // AHardwareBuffer转GraphicBuffer GraphicBuffer* gBuffer = GraphicBuffer::fromAHardwareBuffer(aHardwareBuffer); // GraphicBuffer转AHardwareBuffer AHardwareBuffer* ahb = reinterpret_cast<AHardwareBuffer*>(gBuffer); ``` 这种设计使得`AHardwareBuffer`成为跨层传递的"桥梁"[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值