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

4
移动设备的CPU和GPU共享内存的唯一获利方式是使用 GrphicBuffer 。但自从Android 7开始限制访问私有本地库(包括gralloc),这种方法就不再可行了。问题是,是否有其他替代方法可以直接访问纹理像素数据的内存?
我知道,使用PBO(像素缓冲区对象)可以做类似的事情。但它仍然需要进行额外的内存复制,这是不希望看到的。特别是如果我们知道,有一种零复制的方法来完成。
许多应用程序都使用了这个功能,因为它可以大大提高性能。我认为现在许多开发人员都遇到了这个问题。
2个回答

2
自 Android 8 / API 26 开始(抱歉不支持 Android 7...),硬件缓冲区 API 可以替代 GrphicBuffer()
引用块中写道:

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

NDK 修订历史记录 最低 NDK 版本是 15c(2017 年 7 月)。
引用块中写道:

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

android/hardware_buffer_jni.h 在目录 (NDK)/sysroot/usr/include/ 中。
参考资料:
NDK - 本地硬件缓冲区 (android/hardware_buffer_jni.h)
Android/Java - 硬件缓冲区
与GrphicBuffer相关的文章使用OpenGL ES加速具有传统2D GUI的应用程序

NB:适用于Android 7 / API 24
Native API指南还在图形/EGL部分中提到

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)

eglCreateNativeClientBufferANDROID必须在api24及以上版本中使用? - peerless2012

0

我认为您可以使用SurfaceTexture,SurfaceTexture可以由MediaCore创建,SurfaceTexture可以通过MediaCore直接编码。这个方案可以在2毫秒至5毫秒每帧的处理时间内处理1080p视频。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接