DXGI 1.4的新特性

    其實到寫這篇文章的時候,DXGI已經出1.5版了,但不少朋友實際上還在用1.2甚至1.1,因此如今談1.4一點也不過期,並且1.4又是一次很是重大的更新,很值得仔細談談。windows

    爲了支持Direct3D 12(DXGI還處於1.4版本的時候,Direct3D還按照老命名方式叫Direct3D 12,如今已統一改名爲DirectX 12),DXGI加入了一下這些新功能:緩存

  • 更廉價的適配器枚舉機制
  • 視頻內存預算追蹤
  • Direct3D 12Swapchain 改進
  • 相關話題

更廉價的適配器枚舉機制多線程

    在Direct3D 12裏已經不能從device反向追蹤建立它的IDXGIAdapter適配器對象了。在調用D3D12CreateDevice的時候也不能指定D3D_DRIVER_TYPE_WARP了。但你能夠用IDXFactory4去處理這些事。IDXGIFactory4::EnumAdapterByLuid能夠在D3D 12環境下追蹤建立device的adapter(與ID3D12Device::GetAdapterLuid結對使用)。若是想讓D3D12CreateDevice使用WARP渲染器,要用到IDXGIFactory4::EnumWarpAdapter提供的適配器(Adapter)。ide

視頻內存預算追蹤函數

    微軟建議開發者在處理視頻內存時使用他們設計的預定內存系統,這樣能告知操做系統爲開發者預留應用所須要的最低內存。(這是一種很好的機制,但也有些限制)優化

    一個系統能爲某個應用提供的物理內存數量叫作這個應用的「視頻內存預算(video memory budget)」。當後臺進程喚醒或睡眠的時候預算會出現極大的波動;當終端用戶切換進程的時候預算會急劇變化。應用此時會被系統通知並進行統計當前消費內存和預算內存。應用若是以爲預算不夠,就會休眠並容許其餘應用執行,當時調用的建立類函數也有可能返回錯誤。IDXGIAdapter3就與此事有關,尤爲是QueryVideoMemoryInfo和RegisterVideoMemoryBudgetChangeNotificationEvent。ui

    更多相關信息查看這裏:Residency操作系統

Direct3D 12Swapchain 改進線程

    爲了減少開銷,在D3D12中,有些D3D11時代的swapchain功能不建議再使用了。爲了更好地對應D3D12中的新概念以及爲新功能服務,微軟還對API作了其餘一些調整,設計

恆定backbuffer一致

    在D3D11,應用只能調用GetBUffer(0,…)一次。每次調用Present都隱含着修改了返回接口的一致性。因爲CPU開銷需求和彈性的資源描述符設計,D3D12再也不支持這種隱性資源一致性變動。那麼應用就須要爲每塊和swapchain一塊兒建立的buffer手動調用GetBuffer。應用也得手動渲染在Present操做以後的隊列中的buffer。微軟也鼓勵開發者不要每次Present就重建不少對象,而是給每一個緩衝區(buffer)緩存(cache)。

多適配器支持

    在多GPU適配器環境下,backbuffer只從節點1建立,而且只有一個命令隊列(command queue,這在DirectX中是至關重要的概念,尤爲是多線程多適配器多顯示器的環境中)ResizeBuffer容許應用在其餘節點建立backbuffer,還容許給每一個backbuffer使用不一樣的命令隊列。這些功能與swapchain一塊兒構建了交替幀渲染(AFR)技術。更多請看Direct3D 12 Multi-Adapters

雜項

  • 命令隊列再也不傳給D3D的device對象而必定要傳給CreateSwapChain方法。
  • 只支持如下兩個flip mode swap effects:

    應用全力渲染backbuffer或想更輕巧地支持多適配器場景就應該優先使用DXGI_SWAP_EFFECT_FLIP_DISCARD標識符

    若是想優化畫面提交過程或正式從前一個已經提交的backbuffer裏進行讀取就應該用DXGI_SWAPEFFECT_FLIP_SEQUENTIAL標識符

  • SetFullscreenState對顯示再也不具有排斥性,因此用戶初始化的操做系統元素能夠無縫顯示在應用輸出的前面。好比說體設定(Volume Settings)。

相關話題

Direct3D 12 Hardware Feature Levels
Programming Guide for DXGI
相關文章
相關標籤/搜索