gpt4 book ai didi

directx-11 - DirectX 11 中的渲染

转载 作者:行者123 更新时间:2023-12-01 12:34:21 27 4
gpt4 key购买 nike

当帧开始时,我会进行逻辑更新并在此之后进行渲染。
在我的渲染代码中,我做通常的事情。我设置了一些状态、缓冲区、纹理,并通过调用 Draw 来结束。

m_deviceContext->Draw(
nbVertices,
0);

在帧结束时,我调用 present 来显示渲染帧。
// Present the back buffer to the screen since rendering is complete.
if(m_vsync_enabled)
{
// Lock to screen refresh rate.
m_swapChain->Present(1, 0);
}
else
{
// Present as fast as possible.
m_swapChain->Present(0, 0);
}

平常的东西。现在,当我调用 Draw 时,根据 MSDN

Draw submits work to the rendering pipeline.



这是否意味着数据被发送到 GPU 并且主线程(称为 Draw)继续?还是等待渲染完成?

在我看来,只有 Present 函数应该让主线程等待渲染完成。

最佳答案

有许多调用可以触发 GPU 开始工作,Draw成为一个。其他包括Dispatch , CopyResource等等。MSDN 文档想要说的是像 PSSetShader 这样的东西。 . IASetPrimitiveTopology等在您调用 Draw 之前不会真正做任何事情.

当您调用 Present这被视为“帧结束”的隐含指示,但您的程序通常可以在第一帧完成并显示之前继续为下一帧设置渲染调用。默认情况下,Windows 将允许您在 Present 上阻塞 CPU 线程之前排队最多 3 帧。调用让 GPU catch - 在实时渲染中,您通常不希望输入和渲染之间的延迟非常高。

然而,事实是,GPU/CPU 同步很复杂,而且 Direct3D 运行时也在处理请求以最小化内核调用开销,因此在将许多 Draw 提交到命令队列之后,实际工作可能会发生。 This old article让您了解它是如何工作的。在现代 GPU 上,您还可以进行各种内存操作,用于在内存中进行分页、设置物理显存区域等。

顺便说一句,Direct3D 12 不存在所有这些“魔法”,但这意味着应用程序必须在“正确”的时间做所有事情,以确保它既高效又实用。程序员更直接地构建命令队列,触发各种像素和计算 GPU 引擎的工作,并完成所有由 Direct3 11 的运行时更加抽象和自动处理的杂乱工作。即便如此,最终视频驱动程序实际上是与硬件对话的驱动程序,因此它们也可以进行其他类型的优化。

这里要记住的一般经验法则:

  • 创建资源的成本很高,尤其是运行时着色器编译(通过 HLSL 编译器)和运行时着色器 blob 优化(通过驱动程序)
  • 将资源复制到 GPU(即从 CPU 内存加载纹理数据)需要供应有限的总线带宽:最好将纹理、VB 和 IB 数据保留在您重用的静态缓冲区中。
  • 从 GPU 复制资源(即将 GPU 内存移动到 CPU 内存)使用比转到 GPU 更慢的反向 channel :尽量避免需要从 GPU 回读
  • 每次 Draw 调用提交更大的几何 block 有助于分摊开销(即,为 10,000 个具有相同状态/着色器的三角形调用一次绘制比为 1000 个三角形调用一次绘制 10 次要快得多,每个三角形具有不同的状态/着色器)。
  • 关于directx-11 - DirectX 11 中的渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31020638/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com