Opengl 非同步/非阻塞地图

2024-04-24

我刚刚找到以下内容OpenGL 规范ARB_map_buffer_range http://www.opengl.org/registry/specs/ARB/map_buffer_range.txt.

我想知道是否可以使用此扩展进行非阻塞地图调用?

目前,在我的应用程序中,我正在渲染到 FBO,然后将其映射到主机 PBO 缓冲区。

glMapBuffer(target_, GL_READ_ONLY);  

然而,这样做的问题是它会在传输数据时阻塞渲染线程。

我可以通过管道化渲染来减少这个问题,但延迟是我的应用程序中的一个大问题。

我的问题是我是否可以将map_buffer_range与MAP_UNSYNCHRONIZED_BIT一起使用并等待地图操作在另一个线程上完成,或者在渲染线程渲染下一帧时推迟同一线程上的地图操作。

e.g.

thread 1:

map();
render_next_frame();

thread 2:

wait_for_map

or

thread 1:

map();
while(!is_map_ready())
   do_some_rendering_for_next_frame();

我不确定的是我如何知道映射操作何时准备就绪,规范仅提到“确保正确操作的其他同步技术”。

有任何想法吗?


如果你映射一个缓冲区GL_MAP_UNSYNCHRONIZED_BIT,驱动程序不会等到 OpenGL 处理完该内存后再为您映射它。所以你或多或少会立即访问它。

问题是这确实not意味着你可以随意读/写该内存。如果 OpenGL 正在读取或写入该缓冲区并且您更改了它...欢迎来到未定义的行为。其中可能包括崩溃。

因此,为了实际使用非同步映射,您必须将您的行为与 OpenGL 对该缓冲区的访问同步。这将涉及使用ARB_sync 对象 http://www.opengl.org/wiki/Sync_Object(如果您仅使用 NVIDIA 并且最近没有更新驱动程序,则为 NV_fence)。

话虽这么说,如果您使用栅栏对象来同步对缓冲区的访问,那么您确实不需要GL_MAP_UNSYNCHRONIZED_BIT根本不。一旦完成栅栏,或检测到它已完成,您就可以正常映射缓冲区,并且它应该立即完成(除非其他操作也在读/写)。

一般来说,当您需要对缓冲区进行细粒度的写访问时,最好使用非同步访问。在这种情况下,充分利用同步对象将获得您真正需要的东西(能够判断映射操作何时完成)。


附录:以上内容现已过时(取决于您的硬件)。感谢 OpenGL 4.4/ARB_缓冲区_存储 http://www.opengl.org/registry/specs/ARB/buffer_storage.txt,您现在不仅可以不同步映射,还可以保持映射的缓冲区无限期地。是的,您可以映射缓冲区当它在使用时。

这是通过创建不可变存储并为该存储提供(除其他外)GL_MAP_PERSISTENT_BIT。然后你glMapBufferRange,也提供相同的位。

现在从技术上来说,这几乎没有改变。您仍然需要将您的操作与 OpenGL 同步。如果您将内容写入缓冲区的某个区域,则需要发出障碍 http://www.opengl.org/wiki/GLAPI/glMemoryBarrier or 显式刷新缓冲区的该区域 http://www.opengl.org/wiki/GLAPI/glFlushMappedBufferRange。如果你正在阅读,你仍然需要使用栅栏同步对象 http://www.opengl.org/wiki/Sync_Object以确保数据确实是there在阅读之前(除非你使用GL_MAP_COHERENT_BIT同样,您需要在阅读之前发出障碍)。

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

Opengl 非同步/非阻塞地图 的相关文章

  • 计算边界球体半径时遇到一些问题

    我已经设法用两种方法计算边界球体半径 但没有一种方法能够准确地满足我的要求 我不需要 像素 完美边界球 但我想要比我目前拥有的更好的东西 我正在使用 Wavefront obj 模型并计算这些模型的边界球半径 我提取当前模型尺寸 我使用 N
  • 在 Mac OS X 上使用 Python 生成新的非阻塞进程

    我找到了一些文章甚至堆栈 overflow针对这个主题的问题 但我仍然做不到 我想要做的是从 python 打开一个 firefox 实例 那么python应用程序应该继续关注自己的事情并忽略firefox进程 我能够使用以下方法在 Win
  • OpenGL NURBS 曲面

    我正在学习 OpenGL 我想要一个中间有轻微驼峰的表面 我目前正在使用这段代码 但我不确定如何调整 ctrl 点以使其达到我想要的方式 它目前就像 我想要这样的 我不完全确定我应该使用哪些控制点 并且我对其工作原理感到困惑 include
  • 为 WinSocks 和 *nix 制作非阻塞套接字

    在 C C 中 如何将 WinSocks 和 nix 中的阻塞套接字转换为非阻塞套接字 这样 select 就能正常工作 您可以将预处理器用于特定于平台的代码 在Linux上 fcntl fd F SETFL O NONBLOCK Wind
  • 没有着色器的 OpenGL

    我已经阅读了一些教程来编写以下代码 唯一的区别是原始教程使用 SDL 而不是 GLEW 我不明白这段代码有什么问题 它可以编译 但我没有看到三角形 教程也没有使用着色器 include
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • 如何正确离开临界区?

    我有以下 C 代码 我在其中使用临界区对象 https msdn microsoft com en us library windows desktop ms682530 v vs 85 aspx EnterCriticalSection
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • QOpenGLFunctions 缺少重要的 OpenGL 函数

    QOpenGLFunctions 似乎缺少重要的函数 例如 glInvalidateFramebuffer 和 glMapBuffer 据我了解 QOpenGLFunctions 加载桌面 OpenGL 函数和 ES 函数的交集 如果是这样
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • OpenGL z轴指向哪里?

    我正在尝试了解 OpenGL 坐标系 我到处都看到它被描述为右撇子 但这与我的经验不符 我尝试绘制一些形状和 3 d 对象 我发现 z 轴显然指向 屏幕 而 x 指向右侧 y 指向上方 这是左手坐标系的描述 我缺少什么 编辑 例如 http
  • gluPerspective 与 gluOrtho2D

    我查看了 MSDN 上关于这两个函数的文档 但是 我不太明白这两个功能之间的区别 一个是用于设置 3D 相机视图 另一个是用于设置 2D 相机视图 如果能得到解答就太好了 预先感谢您的评论 正交投影基本上是没有透视的 3D 投影 本质上 这
  • 我的绘图存在坐标/glortho 问题

    I have made a bit of a change to my code in the last couple of hours as everything was messy with my grid so I made it i
  • openGL转png

    我正在尝试将包含大量纹理 没有移动 的 openGL 编辑 我画的卡片 thx unwind 转换为一个 PNG 文件 我可以在框架的另一部分中使用该文件我正在与 有 C 库可以做到这一点吗 thanks 如果您的意思只是 获取由 Open
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

    我正在使用 lwjgl 3 并学习现代 opengl 3 我想将统一矩阵发送到顶点着色器 以便我可以应用转换 我尝试过 但程序因此错误而崩溃 A fatal error has been detected by the Java Runti
  • 同步不经常更新的哈希图的最佳方式

    我有一个在应用程序中使用的 HashMap 数据是在应用程序初始加载期间从数据库填充的 然后它始终只是读取并且从不更新 会有多个线程不断地读取数据 由于数据永远不会更新 因此我们目前不使用任何同步 仅使用 HashMap 我们现在定义的方式
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • 编写/转换 Meteor 同步函数

    这已经困扰我一段时间了 所以我想我应该对其进行快速的质量检查 如果有一个普通的nodeJS模块或其他东西 并且它在服务器端有一个异步功能 我如何使其同步 例如我如何转换nodejsfs stat异步函数转为同步函数 例如我有 服务器端js

随机推荐