2014-08-29 265 views
0

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

在此先感谢。

回答

0

我想你要问的东西在很大程度上取决于硬件和驱动程序的实现。这也是为什么DX11文档不会对内存如何管理图形资源做任何声明。我无法真正给你任何有效的来源,但我相信假设你制作视图的纹理/缓冲区将驻留在GPU的内存(尤其是你更频繁访问的内存)中是安全的。图形驱动程序将进行大量访问优化。但是,最好尽可能少地改变图形管道的状态。

您可以在图形管线的深入讨论读取here

1

在一般情况下,你应该假设一旦你创造的GPU资源(例如,使用CreateTexture2D),内存是保留的,居民对于资源供3D管线使用。请注意,这是独立的数据转移到GPU,这也是通过Map/UnmapUpdateSubresource明确。

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

请注意,上述确实只适用于独立GPU配置。在集成系统上来自英特尔或AMD,您将获得具有完全不同特性的统一内存。但总的来说,你应该首先针对不同的配置,因为如果你搞砸了,你就不得不担心更多的性能障碍,而且它们不太可能在集成上出现。

回到你原来的问题,改变绘制调用之间的SRV并不是那么昂贵 - 它不仅仅是指针交换,而且远不是通过总线传输整个纹理的成本。您应该可以随意抽取与您的平局相同频率的SRV,并且不会对性能产生不利影响。