Android 7的GraphicBuffer替代方案可直接访问OpenGL纹理内存

时间:2016-11-10 12:11:58

标签: android performance opengl-es android-ndk android-7.0-nougat

从移动设备为CPU和GPU共享内存的事实中获利的唯一方法就是使用GrphicBuffer。但由于Android 7限制访问私有本机库(包括gralloc),因此无法再使用它。问题是 - 有没有其他方法可以直接访问纹理的像素数据?

我知道,可以使用PBO(像素缓冲对象)完成类似的事情。但它仍然会进行额外的内存复制,这是不可取的。特别是如果我们知道的话,有办法用零拷贝来做。

有许多应用程序使用此功能,因为它可以大大提高性能。我想现在很多开发人员都遇到了这个问题。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用SurfaceTexture,SurfaceTexture可以由MediaCore创建,SurfaceTexture可以由MediaCore直接编码。该计划可以在每个视频帧2ms-5ms中处理1080p视频。

答案 1 :(得分:0)

自Android 8 / API 26起(抱歉,Android 7 ...不适用)

Hardware Buffer APIsGrphicBuffer()的替代项。

  

本机硬件缓冲区API可让您   直接分配缓冲区以创建自己的管道   跨进程缓冲区管理。您可以分配AHardwareBuffer   并通过它来获取EGLClientBuffer资源类型   eglGetNativeClientBufferANDROID扩展。

NDK revision history

NDK的最低版本为15c(2017年7月)

  

Android NDK,修订版15c(2017年7月)
  添加了适用于Android 8.0的本机API。
  *硬件缓冲区API

android/hardware_buffer_jni.h在目录(NDK)/sysroot/usr/include/

参考:
NDK-Native Hardware Buffer(android / hardware_buffer_jni.h)
Android / Java-HardwareBuffer
GrphicBuffer相关文章Using OpenGL ES to Accelerate Apps with Legacy 2D GUIs

NB:适用于Android 7 / API 24
本机API指南还在Graphics/EGL section

中说
  

API级别24添加了对EGL_KHR_mutable_render_buffer的支持,   ANDROID_create_native_client_buffer,以及   ANDROID_front_buffer_auto_refresh扩展。

EGL_ANDROID_create_native_client_buffer是包含eglCreateNativeClientBufferANDROID()的EGL扩展名,它返回EGLClientBuffer。 (EGL / eglext.h)