我正在研究一些使用着色器在Android上运行某些GPGPU代码的代码。通常使用Framebuffer
,因此计算结果存储在纹理中。输入数据通常也是纹理。为了提高性能,最好摆脱glTexImage2D
和glReadPixels
上传和下载GPU内存空间的图像。与OpenGL相关的所有代码都是原生的。
在Android GraphicBuffer
上可以在Android上用于此建议,因为在移动设备中,gpu内存只是主机RAM内存。此结构允许使用memcpy
与GPU传输数据。这应该比使用OpenGL函数更快。
我一直在使用这篇被引用的文章[1] [2] [3],使用{{1}将纹理成功上传到Android的GPU内存空间}}
后来我尝试使用相同的方法将纹理数据移回CPU空间,但我仍然遇到一些问题。根据答案[7],这是不可能的。但是,在StackOverflow中进一步阅读其他一些答案似乎不然。在{4] [5] [6]中报告了GraphicBuffer
从glReadPixels
成功替换memcpy
的一些案例。大多数人似乎都说在锁定和阅读GraphicBuffer
之前放置glFinish
会使其内容在读取时按预期更新。
根据我的经验,它没有开箱即用,但似乎确实存在计时问题。只是调用GraphicBuffer
似乎不够,但如果我在读取缓冲区之前等待几毫秒(即放置glFinish
),那么内容似乎是正确的。这实际上不是一个解决方案,因为它最终比原来的sleep
解决方案慢(并且无论如何它都不是一个非常可靠的解决方案),但表明内容IS在某个时刻实际更新。 / p>
我的问题是:
{{{}}]中所说的glReadPixels
无法直接读取,或者从那时起发生了变化,这是真的吗?
它似乎对其他人有用,这只是巧合吗?
是否有更好的方法来强制更新内存(例如更强的GraphicBuffer
来电)?