在一般情况下,你应该假设一旦你创造的GPU资源(例如,使用CreateTexture2D
),内存是保留的,居民对于资源供3D管线使用。请注意,这是独立的数据转移到GPU,这也是通过Map
/Unmap
或UpdateSubresource
明确。
在某些情况下,操作系统会将内存交换出来,但通常应尽可能避免这种情况。例如,如果您创建了一堆大纹理,但从不访问它们,则视频内存管理器最终会将它们分页到系统内存以执行其他任务(例如,观看Netflix /在另一个显示器上浏览互联网)。如果您过度使用视频内存(使用的系统数量超过可用容量),您也可能遇到实际问题。这曾经是不可能的(你只会得到E_OUTOFMEMORY
),但现在内存管理器试图通过将事情分页到系统内存或磁盘来实现它。这是你应该真的努力避免,因为如果你曾经绑定和使用一个页面调出资源,你会得到一个小故障等待内存管理器将其重新分页使用。
请注意,上述确实只适用于独立GPU配置。在集成系统上来自英特尔或AMD,您将获得具有完全不同特性的统一内存。但总的来说,你应该首先针对不同的配置,因为如果你搞砸了,你就不得不担心更多的性能障碍,而且它们不太可能在集成上出现。
回到你原来的问题,改变绘制调用之间的SRV并不是那么昂贵 - 它不仅仅是指针交换,而且远不是通过总线传输整个纹理的成本。您应该可以随意抽取与您的平局相同频率的SRV,并且不会对性能产生不利影响。