【问题标题】:Directx 11 RegistersDirectx 11 寄存器
【发布时间】:2014-09-02 00:46:55
【问题描述】:

我对 DirectX 11 中的寄存器有些困惑。让我举个例子:假设您有 3 个模型。它们每个都有一个映射到寄存器 t0 的纹理。模型 1 和 3 使用相同的纹理,模型 2 使用不同的纹理。在绘制模型1时,我将纹理资源视图设置为寄存器0并绘制模型。然后我对模型 2 和 3 做同样的事情,但对模型 3 使用相同的资源视图。当我为模型 2 设置纹理时,GPU 是用不同的纹理替换 GPU 内存中的纹理,还是这样做保持纹理内存直到需要空间并且只是移动一些指针?我想尽量减少到 GPU 的数据传输,我想知道我是否应该自己处理这些情况,或者 DX 是否会为我处理。顺便说一句,我没有使用 Effects 11 框架。

提前致谢。

【问题讨论】:

    标签: c++ memory directx textures directx-11


    【解决方案1】:

    一般来说,您应该假设一旦您在 GPU 上创建了一个资源(例如,使用 CreateTexture2D),该内存就会为该资源保留并驻留以供 3D 管道使用。请注意,这是独立的数据传输到 GPU,这也是通过 Map/UnmapUpdateSubresource 明确的。

    在某些情况下,操作系统会交换内存和交换内存,但通常应尽可能避免这种情况。例如,如果您创建了一堆大纹理但从不访问它们,最终视频内存管理器会将它们分页到系统内存以用于其他任务(例如,观看 Netflix / 在另一个显示器上浏览互联网)。如果您过度使用视频内存(使用超过系统上可用的内存),您也可能遇到真正的问题。这曾经是不可能的(你只会得到E_OUTOFMEMORY),但现在内存管理器试图通过将内容分页到系统内存甚至磁盘来使其工作。这是您应该真正努力避免的事情,因为如果您曾经绑定并使用已分页的资源,您将遇到等待内存管理器将其分页放回以供使用的故障。 p>

    请注意,上述内容仅适用于离散 GPU 配置。在集成系统上,例如来自 Intel 或 AMD,您将获得具有完全不同特性的统一内存。但一般来说,你应该首先针对离散配置,因为如果你搞砸了,你需要担心更多的性能悬崖,而且它们不太可能出现在集成上。

    回到您最初的问题,在绘制调用之间更改 SRV 并没有那么昂贵 - 它不仅仅是指针交换,但远不及通过总线传输整个纹理的成本。您应该可以随意以与绘制调用相同的频率交换 SRV,并且不会对性能产生不利影响。

    【讨论】:

      【解决方案2】:

      我认为您的要求很大程度上取决于硬件和驱动程序的实现。这也是为什么 DX11 文档没有就如何为图形资源管理内存做出任何声明。我真的不能给你任何有效的来源,但我相信可以安全地假设你创建视图的纹理/缓冲区将驻留在 GPU 的内存中(尤其是你更频繁访问的那些)。显卡驱动会做很多访问优化。但是,最好尽量少改变图形管线的状态。

      您可以阅读有关图形管道的深入讨论here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多