复杂的游戏会运用大量纹理和3D网格等资源,但是其中的大多数并不需要总是置于显存中供GPU使用。例如,让我们来构想这样一个场景资源:在野外森林中有一个巨大的洞穴。在玩家进入洞穴前,绘制画面并不会用到与洞穴相关的资源;当玩家进入洞穴后,又不再需要森林数据资源。
在Direct3D 12中,应用程序通过控制资源的在显存中的去留,主动管理资源的驻留情况(即residency。无论资源是否已位于显存中,都可以对其管理,都可对其进行管理。在Direct3D 11中则有系统自动管理)。该技术的基本思路为使用程序占用最小的显存空间。这是因为显存的空间有限,很可能不足以容下整个游戏的所有资源,或者用户还有运行中的程序也在同时使用显存。这里给出一条与性能相关的提示:程序应当避免在短时间内于显存中交换进出相同的资源,这会引起过高的开销。最理想的情况时,所清出的资源在短时间内不会再次使用。游戏关卡或游戏场景的切换是关于常驻资源的好例子。
一般来说,资源在创建时就会驻留再显存中,而当它被销毁时则清出。但是通过下面的方法,我们就可以自己来控制资源的驻留。
HRESULT ID3D12Device::MakeResident(
UINT NumObjects,
ID3D12Pageable* const* ppObjects);
HRESULT ID3D12Device::Evict(
UINT NUmObjects,
ID3D12Pageable* const* ppObjects);
这两种方法的第二个参数都是ID3D12Pageable 资源数据,第一个参数则表述该数组中资源数量。