我正在编写一些使用着色器在 Android 上运行一些 GPGPU 代码的代码。通常是一个Framebuffer
使用因此计算结果存储在纹理中。输入数据通常也是纹理。为了提高性能,最好摆脱glTexImage2D
and glReadPixels
将图像上传到 GPU 内存空间或从 GPU 内存空间下载图像。所有与 OpenGL 相关的代码都是本机的。
在安卓上GraphicBuffer
可以在 Android 上使用此建议,因为在移动设备中 GPU 内存只是主机 RAM 内存。该结构允许使用memcpy
与 GPU 传输数据。这应该比使用 OpenGL 函数更快。
我一直在使用这篇被引用次数非常多的文章[1 https://software.intel.com/en-us/articles/using-opengl-es-to-accelerate-apps-with-legacy-2d-guis][2 https://vec.io/posts/faster-alternatives-to-glreadpixels-and-glteximage2d-in-opengl-es][3 http://snorp.net/2011/12/16/android-direct-texture.html] 使用以下命令成功将纹理上传到 Android 的 GPU 内存空间GraphicBuffer
.
后来我尝试使用相同的方法将纹理数据移回 CPU 空间,但仍然遇到一些问题。根据回答[7 https://stackoverflow.com/a/25535693/4116251】 应该是不可能的。但进一步阅读 StackOverflow 中的其他一些答案似乎表明情况并非如此。部分更换成功案例glReadPixels
by a memcpy
from a GraphicBuffer
报道于[4 https://stackoverflow.com/questions/25564203/what-is-wrong-when-i-use-eglimage-replace-glreadpixels-in-ndk-program][5 https://stackoverflow.com/questions/24448977/unexpected-pixel-data-layout-when-reading-from-graphicbuffer][6 https://stackoverflow.com/questions/21151259/replacing-glreadpixels-with-egl-khr-image-base-for-faster-pixel-copy]。大多数人似乎都说放置glFinish
就在锁定和读取之前GraphicBuffer
使其内容在阅读时按预期更新。
根据我的经验,它并不是开箱即用的,但似乎确实存在一个时间问题。只是打电话glFinish
似乎还不够,但如果我在读取缓冲区之前等待几毫秒(即放置一个sleep
)那么内容似乎是正确的。这实际上不是一个解决方案,因为它最终比原来的速度慢glReadPixels
解决方案(无论如何它不会是一个非常可靠的解决方案),但表明内容实际上在某个时刻进行了更新。
我的问题是:
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)