其實(shí)到寫這篇文章的時(shí)候,DXGI已經(jīng)出1.5版了,但很多朋友實(shí)際上還在用1.2甚至1.1,所以現(xiàn)在談1.4一點(diǎn)也不過時(shí),而且1.4又是一次非常重大的更新,很值得仔細(xì)談?wù)劇?
為了支持Direct3D 12(DXGI還處于1.4版本的時(shí)候,Direct3D還按照老命名方式叫Direct3D 12,現(xiàn)在已統(tǒng)一更名為DirectX 12),DXGI加入了一下這些新功能:
- 更廉價(jià)的適配器枚舉機(jī)制
- 視頻內(nèi)存預(yù)算追蹤
- Direct3D 12Swapchain 改進(jìn)
- 相關(guān)話題
更廉價(jià)的適配器枚舉機(jī)制
在Direct3D 12里已經(jīng)不能從device反向追蹤創(chuàng)建它的IDXGIAdapter適配器對(duì)象了。在調(diào)用D3D12CreateDevice的時(shí)候也不能指定D3D_DRIVER_TYPE_WARP了。但你可以用IDXFactory4去處理這些事。IDXGIFactory4::EnumAdapterByLuid可以在D3D 12環(huán)境下追蹤創(chuàng)建device的adapter(與ID3D12Device::GetAdapterLuid結(jié)對(duì)使用)。如果想讓D3D12CreateDevice使用WARP渲染器,要用到IDXGIFactory4::EnumWarpAdapter提供的適配器(Adapter)。
視頻內(nèi)存預(yù)算追蹤
微軟建議開發(fā)者在處理視頻內(nèi)存時(shí)使用他們?cè)O(shè)計(jì)的預(yù)約內(nèi)存系統(tǒng),這樣能告知操作系統(tǒng)為開發(fā)者預(yù)留應(yīng)用所需要的最低內(nèi)存。(這是一種很好的機(jī)制,但也有些限制)
一個(gè)系統(tǒng)能為某個(gè)應(yīng)用提供的物理內(nèi)存數(shù)量叫做這個(gè)應(yīng)用的“視頻內(nèi)存預(yù)算(video memory budget)”。當(dāng)后臺(tái)進(jìn)程喚醒或睡眠的時(shí)候預(yù)算會(huì)出現(xiàn)極大的波動(dòng);當(dāng)終端用戶切換進(jìn)程的時(shí)候預(yù)算會(huì)急劇變化。應(yīng)用此時(shí)會(huì)被系統(tǒng)通知并進(jìn)行統(tǒng)計(jì)當(dāng)前消費(fèi)內(nèi)存和預(yù)算內(nèi)存。應(yīng)用如果覺得預(yù)算不夠,就會(huì)休眠并允許其他應(yīng)用執(zhí)行,當(dāng)時(shí)調(diào)用的創(chuàng)建類函數(shù)也有可能返回錯(cuò)誤。IDXGIAdapter3就與此事有關(guān),尤其是QueryVideoMemoryInfo和RegisterVideoMemoryBudgetChangeNotificationEvent。
更多相關(guān)信息查看這里:Residency。
Direct3D 12Swapchain 改進(jìn)