【问题标题】:Multithreading in Direct 3D 12Direct 3D 12 中的多线程
【发布时间】:2022-07-02 16:09:36
【问题描述】:

您好,我是学习 Direct 3D 12 的新手。

到目前为止,我了解 Direct 3D 12 是为多线程设计的,我正在尝试按照 braynzarsoft 的教程制作自己的简单多线程演示。

https://www.braynzarsoft.net/viewtutorial/q16390-03-initializing-directx-12

环境是windows,使用C++,Visual Studio。

据我了解,简而言之,Direct 3D 12 中的多线程似乎是在多个线程中填充命令列表。

如果是对的,那似乎

  • 1 交换链
  • 1 个命令队列
  • N 个命令列表(N 对应于线程数)
  • N 个命令分配器(N 对应于线程数)
  • 1 栅栏

对于单个窗口程序来说已经足够了。

不知道

第一季度。我们什么时候需要多个命令队列?

第二季度。为什么我们需要多个栅栏?

第三季度。我们什么时候多次提交命令?

第四季度。 GetCPUDescriptorHandleForHeapStart() 返回值是否变化?

Q3 来自这里。

https://developer.nvidia.com/sites/default/files/akamai/gameworks/blog/GDC16/GDC16_gthomas_adunn_Practical_DX12.pdf

Q4的目的是我想调用一次函数并存储值以供重复使用,调试时没有改变。

我心目中的渲染循环是(基于Game Loop模式),例如,

  1. 线程等待栅栏值(例如主线程)。
  2. 启动多个线程来填充命令列表。
  3. 等待所有线程完成填充。
  4. 执行命令列表。
  5. 存在交换链。
  6. 在下一个循环中返回 1。

如果我完全误解了,请帮忙。

【问题讨论】:

    标签: c++ multithreading window direct3d


    【解决方案1】:

    第一季度。我们什么时候需要多个命令队列?

    阅读此https://docs.microsoft.com/en-us/windows/win32/direct3d12/user-mode-heap-synchronization

    1. 异步和低优先级 GPU 工作。这样可以并发执行低优先级 GPU 工作和原子操作,从而使一个 GPU 线程能够使用另一个非同步线程的结果而不会阻塞。
    2. 高优先级计算工作。通过后台计算,可以中断 3D 渲染以执行少量高优先级计算工作。这项工作的结果可以及早获得,以便在 CPU 上进行额外处理。
    3. 后台计算工作。计算工作负载的单独低优先级队列允许应用程序利用空闲 GPU 周期来执行后台计算,而不会对主要渲染(或其他)任务产生负面影响。
    4. 流式传输和上传数据。一个单独的复制队列取代了初始数据和更新资源的 D3D11 概念。尽管应用程序负责 Direct3D 12 模型中的更多细节,但这种责任伴随着权力。应用程序可以控制用于缓冲上传数据的系统内存量。该应用可以选择同步的时间和方式(CPU 与 GPU,阻塞与非阻塞),并可以跟踪进度并控制排队工作的数量。
    5. 增加并行度。当应用程序有单独的队列用于前台工作时,它们可以将更深的队列用于后台工作负载(例如视频解码)。

    第二季度。为什么我们需要多个栅栏?

    所有 gpu 工作都是异步的。因此,您可以将栅栏视为实现与期货/协程相同结果的低级工具。您可以检查工作是否已完成、等待工作完成或在完成时设置事件。每当您需要保证资源保持工作输出时(当资源障碍不足时),您都需要一个围栏。

    第四季度。 GetCPUDescriptorHandleForHeapStart() 返回值有变化吗?

    不,它没有。

    存储该值以供重复使用,我调试时它没有改变。

    direct3d12 样本就是这样做的,如果你想精通,你应该熟悉它们。

    我心目中的渲染循环是(基于Game Loop模式),例如,

    这听起来不错,但我强烈建议您查看 direct3d12 样本并窃取它们在其中使用的模式(和代码)。

    【讨论】:

      猜你喜欢
      • 2016-12-09
      • 2018-06-17
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2011-04-16
      • 2016-10-16
      • 1970-01-01
      • 2019-09-14
      相关资源
      最近更新 更多