使用GraphicBuffers快速读取纹理

时间:2015-07-07 09:22:08

标签: android c++ opengl-es android-ndk egl

我正在研究一些使用着色器在Android上运行某些GPGPU代码的代码。通常使用Framebuffer,因此计算结果存储在纹理中。输入数据通常也是纹理。为了提高性能,最好摆脱glTexImage2DglReadPixels上传和下载GPU内存空间的图像。与OpenGL相关的所有代码都是原生的。

在Android GraphicBuffer上可以在Android上用于此建议,因为在移动设备中,gpu内存只是主机RAM内存。此结构允许使用memcpy与GPU传输数据。这应该比使用OpenGL函数更快。

我一直在使用这篇被引用的文章[1] [2] [3],使用{{1}将纹理成功上传到Android的GPU内存空间}}

后来我尝试使用相同的方法将纹理数据移回CPU空间,但我仍然遇到一些问题。根据答案[7],这是不可能的。但是,在StackOverflow中进一步阅读其他一些答案似乎不然。在{4] [5] [6]中报告了GraphicBufferglReadPixels成功替换memcpy的一些案例。大多数人似乎都说在锁定和阅读GraphicBuffer之前放置glFinish会使其内容在读取时按预期更新。

根据我的经验,它没有开箱即用,但似乎确实存在计时问题。只是调用GraphicBuffer似乎不够,但如果我在读取缓冲区之前等待几毫秒(即放置glFinish),那么内容似乎是正确的。这实际上不是一个解决方案,因为它最终比原来的sleep解决方案慢(并且无论如何它都不是一个非常可靠的解决方案),但表明内容IS在某个时刻实际更新。 / p>

我的问题是:

  • {{{}}]中所说的glReadPixels无法直接读取,或者从那时起发生了变化,这是真的吗?

  • 它似乎对其他人有用,这只是巧合吗?

  • 是否有更好的方法来强制更新内存(例如更强的GraphicBuffer来电)?

0 个答案:

没有答案