【问题标题】:Multi-threaded Rendering in OpenGLOpenGL中的多线程渲染
【发布时间】:2012-03-13 20:26:20
【问题描述】:

这甚至可能吗?我正在学习 DirectX atm,并正在尝试将我学到的一些知识应用到 OpenGL。

我知道您可以使用延迟上下文在 DirectX 中进行多线程渲染,但我认为 OpenGL 没有这种支持,我在 OpenGL 中找到了多线程示例,但没有找到我试图找出的多线程渲染;还是我误解了其中的区别?

如果可以的话,谁能提供一些基本的代码给我作为例子。

【问题讨论】:

  • 只使用异步上传.. 还有:opengl.org/wiki/OpenGL_and_multithreading
  • 我不确定您将从 MT 渲染中获得什么。 AFAIK、D3D 和 OpenGL 最终必须将命令序列化到驱动程序级别的单个线程。我想 MT 渲染只会使问题严重复杂化。
  • “我知道你可以在 DirectX 中使用延迟上下文进行多线程渲染” 这不是多线程渲染。那只是存储一些渲染命令并播放它们。
  • 延迟上下文背后的想法是驱动程序的工作可以跨多个 CPU 内核进行拆分。即使指令最终按顺序发送到 GPU,如果 CPU 受限,这仍然可以提高性能。

标签: multithreading opengl directx rendering


【解决方案1】:

这并不是对 OP 问题的真正回答,但对他的要求很重要:

GPU 有点像互斥资源。如果您有多个线程执行绘图操作,则会产生管理开销。这项工作必须拆分为着色器单元或涉及一些时间片。无论哪种方式,如果绘图操作转到同一个帧缓冲区,则操作必须同步,这意味着 GPU 管道经常会停止。

最终结果是,在 GPU 上执行多线程操作很可能会导致性能大幅下降。

此外,无需在 GPU 上执行多线程操作来并行化工作。这已经通过将单个绘图操作拆分到 GPU 的各个着色器单元来实现。

【讨论】:

  • 应该补充一点,众所周知,OpenGL 驱动程序是单线程的,因此命令可能最终会出现在同一个命令队列中。多个上下文的唯一有用案例可能是利用 DMA/复制引擎实现真正的异步 IO
  • @itzJanuary:OpenGL 驱动程序中的多线程操作在过去几年中得到了很大改进,但仍然存在很多全局锁。毕竟它是一个大型状态机,并且通过在不同线程的活动上下文之间共享资源,您会触发大量锁。 Vulkan 更适合多线程,但即使在 Vulkan 中,有些事情也会在单个线程中结束。
【解决方案2】:

OpenGL 没有等效于 D3D11 的延迟上下文。与此最接近的是显示列表,但它们解决了一个完全不同的问题,并且非常不意味着要一遍又一遍地重建。

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多