使用 GraphicBuffers 快速读取纹理

2023-12-19

我正在编写一些使用着色器在 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解决方案(无论如何它不会是一个非常可靠的解决方案),但表明内容实际上在某个时刻进行了更新。

我的问题是:

  • 真的是这样吗GraphicBuffer不能直接读取,如[7 https://stackoverflow.com/a/25535693/4116251],或者从那以后发生了什么变化?

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

  • 有没有更好的方法来强制更新内存(例如更强的glFinish call)?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GraphicBuffers 快速读取纹理 的相关文章

随机推荐

  • 在 pinescript 中向警报添加变量

    我想在 pine 脚本中对 TradingView 中的多只股票使用相同的警报条件 问题是我不知道哪只股票触发了警报 除非我创建脚本的副本并为每个脚本提供自定义消息 我想要这样的东西 alertcondition someCondition
  • 相当于 Java 中的 C++ map.lower_bound

    我的问题很基本 但我自己找不到解决方案 我习惯用C 编写算法 在那里我经常使用std map结构 以及它提供的所有辅助方法 此方法将迭代器返回到映射的第一个元素 其中键 gt 作为参数给出的键 例子 map
  • 如何在解决方案中找到未使用的 NuGet 包?

    如何在解决方案中找到未使用的 NuGet 包 我有很多解决方案 其中有很多已安装的软件包 并且其中很大一部分被标记为有更新 但是 我担心可能会发生重大更改 因此我首先想通过删除任何未使用的软件包来进行清理 ReSharper 2016 1
  • 如何使用 Javascript、PHP 等将 html + CSS 页面转换为 pdf? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 但请记住我需要一个免费的图书馆它不会干扰我的网页的 CSS 并轻松转换我的网页的某些部分 我使用了 J
  • 经典 ASP 页面自动将 IE 8 中的 Quriks 模式设置为默认模式

    查看 HTML 时 IE 8 将默认文档模式设置为 IE8 标准 但它会在 ASP 页面上进入怪异模式 即使我使用 这并没有什么帮助 我应该怎么办 我要做的第一件事是将相同的输出放入 HTM 文件中并访问它 如果你得到不同的结果 那么确实发
  • terraform 支持数学舍入吗?

    是否可以在 terraform 字符串插值中舍入整数值 这有点像黑客 不使用 terraform 字符串插值 但是 您可以使用外部数据源 https www terraform io docs providers external data
  • SOAP HTTPS 测试获取类转换异常(字符串到整数)

    我正在使用 HTTPS 上的独立应用程序测试 SOAP 请求 我已经从 WSDL 创建了所需的类 使用 wsimport 我已经使用一些模拟值填充了对象值 令人惊讶的是 我的所有 XML 值都在 String 中 但我收到一个类转换异常 为
  • npm test 未检测到 jenkins 中新的测试文件更改

    Jenkins jest 和 CI 我使用 create react app 创建了一个 React APP 并使用 JEST 进行测试 我在创建的 app test js 文件中做了一些新的更改 并提交给 git hub 当我运行 npm
  • 捕获 Excel 数据透视表刷新事件

    是否有与数据透视表的数据刷新相对应的事件 我已经找到了 worksheet pivottableupdate 事件 但这似乎每次我更改过滤器或操作数据透视表时都会被调用 这在我的宏中非常频繁 我需要的只是捕获底层数据何时更新 有办法做到这一
  • 隐式运算符和类型转换器是否等效?

    在我看来 实现隐式运算符与 TypeConverter 似乎非常容易 因此我假设它们并不等效 因为框架中 TypeConverters 的流行 请参阅扩展 FrameworkElement 的任何内容 但为什么 创建 string gt o
  • 通过 HTTP 传输文件的 Response.TransmitFile 的替代方案

    我正在开发一个允许用户下载文件的 ASP NET 网站 以前 文件存储在与网站相同的服务器上 因此我们可以执行以下操作 Response Clear Response AddHeader Content Disposition attach
  • WinForms - 本地化 - UI 控件在其他文化中的位置不同

    我做了 UI 设置 原始语言是英语 之后我将 Localized 属性设置为 True 将原始 resx 文件复制到 frmMain de De resx 例如 翻译所有字符串 一切正常 但现在我想改变控件的位置 之后变化可见only原始
  • React-native --variant 选项

    可能的值是什么 variant选项除了release 它记录在哪里 我在反应本机文档中找不到 我应该指定这个选项吗debug or devDebug调试构建的价值 thanks 只有两个选择 release and debug 默认vari
  • 如何从文本文件中删除 ^M 并将其替换为下一行

    假设我有一个包含以下内容的文本文件 Hello what is up M M What are you doing 我想删除 M并将其替换为下面的行 所以我的输出看起来像 Hello what is up What are you doin
  • 为所有用户添加一个键到 HKEY_CURRENT_USER

    我有一个安装程序 它在 HKEY CURRENT USER 上安装一个密钥 当我运行安装程序时 它仅将其添加到正在安装的用户上 有没有办法一次性为所有用户添加密钥 Thanks 你必须遍历所有不同的用户HKEY USERS 这需要更高的权限
  • 使用 ls 按一定顺序 scp 文件

    每当我尝试 SCP 文件 在 bash 中 时 它们最终都会以看似随机 的顺序出现 我找到了一种简单但不太优雅的方法来保持所需的顺序 如下所述 有聪明的方法吗 Edit 从这里删除了我早期的解决方案 使用其他建议进行清理 调整 并添加为下面
  • 如何在Linux中创建名称以破折号开头的文件? (例如“-文件”)

    如何在 Linux 中使用命令行创建名为 file 的文件 在其前面指定一个路径 例如 file
  • 从 GCP HTTP 函数调用启动后台进程的最佳方式?

    所以 根据这里的文档https cloud google com functions docs writing http https cloud google com functions docs writing http 终止 HTTP
  • 使用OpenGL ES纹理缓存而不是glReadPixels来获取纹理数据

    在 iOS 5 中 引入了 OpenGL ES 纹理缓存 以提供从相机视频数据到 OpenGL 的直接方式 而无需复制缓冲区 里面有关于纹理缓存的简单介绍会议 414 WWDC 2011 的 iOS 5 OpenGL ES 进展 http
  • 使用 GraphicBuffers 快速读取纹理

    我正在编写一些使用着色器在 Android 上运行一些 GPGPU 代码的代码 通常是一个Framebuffer使用因此计算结果存储在纹理中 输入数据通常也是纹理 为了提高性能 最好摆脱glTexImage2D and glReadPixe