Thursday, May 1, 2014

DirectX 12 简介

有什麼神奇之處?
這次的DirectX 12引入了新版本的Direct3D:位於DirectX核心地位的圖形API。 Direct3D是遊戲或遊戲引擎中最重要的組成部分之一,我們對其進行了重新設計使其比以前更快更高效。由此,Direct3D 12可以渲染更豐富的場景、更多物體,並能更好地利用當前的GPU硬件。而且Direct3D 12不但能用於高端遊戲PC,也可以在所有微軟的設備上運行。從手機和平板,到筆記本和台式機,當然,還有Xbox One。 Direct3D 12就是你期待已久的API。
是什麼讓Direct3D 12獨樹一幟?首先,也是最重要的,它提供了一個比以前更底層的硬件抽象,讓遊戲可以明顯改善多線程能力和CPU利用率。另外描述表(descriptor table)和簡潔的流水線狀態對象(pipeline state object,PSO)等新特性都可以降低GPU的開銷,從而加速遊戲。另外, Direct3D 12也引入了一系列新的渲染流水線功能,可以顯著提升一些算法的效率,比如順序無關透明、碰撞檢測和幾何剔除。
當然,每個API都需要工具來助你一臂之力。 DirectX 12將會包含一些好用的Direct3D工具,伴隨Direct3D 12一起發布。
你可能會對這個感興趣:DirectX 12可以在很多已有的卡上運行。詳細請見後面的FAQ。

這只是噱頭嗎?
我們(產品組)從twitter和遊戲開發/玩家論壇中得到了很多反饋意見。很多人問了DirectX 12是確有其事,還是營銷部門突然得到了一筆資金。實際上,你看到的所有東西都直接來自於近20年來一直兢兢業業開發DirectX的團隊。
我們的任務是建立一個更好的API。同時,我們和軟硬件夥伴緊密合作,以保證Direct3D 12上能有明顯的性能提升。我們沒有自己設計一些小的評測軟件來跑分,而是在我們的alpha版本上直接運行已經發行的商業遊戲引擎或評測軟件。下面的截圖來自於真實的Direct3D12程序代碼、運行在真實的Direct3D 12運行庫和驅動上。

3DMark——多線程能力+ CPU利用率提升50%
如果你是個玩家,你一定知道什麼是3DMark——在硬件和設備上進行遊戲性能評測的好方式。在這裡,我們要用3DMark來檢驗Direct3D 12能給遊戲帶來多少性能提升。 3DMark的Direct3D 11版本雖然廣泛地使用了多線程,但因為運行庫和驅動都有開銷,每個核上仍然有很多空閒時間。當移植到Direct3D 12之後,我們看到了兩個大的改善——CPU利用率提高了50%,以及任務更好地在線程之間分佈。



Direct3D 11

Direct3D 12
 

Forza Motorsport 5技術演示——讓PC達到遊戲機級別的效率
Forza Motorsport 5是一個用快節奏的真實賽車體驗把Xbox One發揮到極限的遊戲。在內部,Forza是通過調用Xbox One上高效的底層API來做到這一點。傳統上,這樣的高效性只會在遊戲機上出現。而現在,即便只是alpha版的Direct3D 12,也能把這種高效帶到PC和手機平台。通過把Xbox One上的Direct3D 11.X核心渲染引擎移植到PC上的Direct3D 12,Turn 10工作室已經讓PC的技術演示也能有遊戲機級別的效率。

 

性能來自何處?
Direct3D 12和Direct3D 11的編程模型很不同,允許程序比以前更接近硬件。我們因此大幅修改了API的很多地方。這裡提供了一個概述,總結了三個關鍵部分:流水線狀態的表達、任務提交和資源訪問。

流水線狀態對象
在Direct3D 11中,流水線狀態通過一大堆獨立無關的對象來操控。比如, input assembler狀態、pixel shader狀態、rasterizer狀態、以及output merger狀態都是可以獨立修改的。這給圖形流水線提供了一個方便而相對高層的表達。但是,這不能很好地映射到現代的硬件上。這主要是因為不同的狀態之間經常有相互依賴。比如,很多GPU把pixel shader和output merger狀態合併成了單個硬件,但因為Direct3D 11允許分開設置,驅動在狀態最終確定前,也就是draw call的時候,是無法提前設置硬件狀態的。這會讓硬件狀態設置產生延遲,也就是額外的開銷,造成每幀的draw call變少。
Direct3D 12通過把多個流水線狀態統一成一個流水線狀態對象(PSO)來解決這個問題。這個對像在建立後就不可改變,表達了所有狀態的最終取值。這讓硬件和驅動可以立刻把PSO轉化成GPU執行所需的硬件原生指令和狀態。動態切換PSO的時候,硬件只需要把少量預計算的狀態直接拷貝到硬件寄存器,而不用每次都重新計算硬件狀態。這意味著可以​​明顯減少draw call的開銷,以提高每幀的draw call數量。

命令列表和命令包
在Direct3D 11裡,所有的任務提交都是通過immediate context來完成的,它代表了一個通向GPU的命令流。遊戲也經常用deferred context來充分利用多線程,但和PSO一樣, deferred context也不能完美地映射到硬件,​​所以deferred context能幫忙的事情也相對較少。
Direct3D 12引入了一種新的任務提交模型。它的基礎是新的命令列表(command list),包含了需要在GPU上執行一個特定工作的所有信息。每個命令列表都包含了用哪個PSO,需要哪些texture和buffer資源,以及所有draw call的參數。因為每個命令列表都是自我包含的,而且不繼承任何狀態,所以驅動可以在多個獨立線程裡提前預計算好所有需要的GPU指令。唯一需要順序操作的只有最終通過命令隊列(command queue)把命令列表提交給GPU的時候,這部分本身就已經相當高效。
除了命令列表之外,Direct3D 12也引入了第二層任務預計算機制,命令包(bundle)。命令列表是完全自我包含的,典型用法是構造、提交一次、丟棄。與之不同的是,命令包允許狀態繼承,更方便重用。比如,如果一個遊戲要畫兩個紋理不同的人物模型,方法之一是記錄一個命令列表,包含兩組相同的draw call。另一種方法是把畫單個人物模型命令“記錄”到一個命令包裡,然後在命令列表上用不同的資源“播放”這個命令包兩次。對後者來說,驅動僅需要計算一次相應的指令,然後建立一個只包含兩次低開銷函數調用的命令列表。

描述庫和描述表
Direct3D 11中的資源綁定非常抽象和方便,但很多現代硬件的能力都被浪費了。在Direct3D 11裡,遊戲建立出資源的“view”對象,然後把這些view綁到流水線中不同shader的“slot”上。 Shader在draw的時候就從顯式綁定的slot中讀取數據。這個模型意味著只要遊戲想要換個資源繪製,就必須重新把不同的view綁定到不同的slot上,然後才能繪製。這個開銷也可以通過充分利用現代硬件的能力來去除。
Direct3D 12把綁定模型改成符合現代硬件的樣子,從而顯著提高性能。 Direct3D 12不再需要獨立的資源view並顯式映射到slot,而是提供了一個描述庫(descriptor heap),讓遊戲可以在裡面建立各種資源view。這個機制讓GPU可以提前把硬件原生的資源描述直接寫入內存。要聲明哪個資源被某個draw call的流水線用到了,遊戲需要在描述庫的某個區域設立一個或多個描述表。因為描述庫中已經被提前寫入硬件相關的描述數據,所以更改描述表來引用不同描述數據的開銷相當低。
除了用描述庫和表提高性能之外,Direct3D 12還允許資源在shader中動態索引,由此帶來了空前的靈活性,並使新的渲染技術成為可能。比如,現代的延遲渲染引擎往往把材質和物體ID編碼到某個中間g-buffer上。在Direct3D 11中,引擎必須避免使用太多材質,因為在一個g-buffer中包含太多材質會顯著低降慢最終的渲染。如果有了動態索引資源,渲染包含上千種材質的場景可以和渲染只包含十種材質的場景一樣快。


想了解更多?
訂閱這個blog http://blogs.msdn.com/b/directx/rss.aspx
關注我們@DirectX12
參加//build
AMD發布會 - DirectX12
NVIDIA的blog - DirectX 12

想要第一批嚐鮮?
你是專業遊戲開發人員嗎?你是否認為Direct3D 12有助於改善你的遊戲的性能?點擊這裡申請加入DirectX 12搶先體驗項目。
隱私條款

FAQ
Q:是否應該等一等再買新的PC或者顯卡A:不需要。你的新PC包含支持DirectX 12的圖形硬件(包括市面上超過80%的遊戲PC),就可以享受所有DirectX 12遊戲。
Q:DirectX 12是否包含了Direct3D 12之外的其他東西?A:同時還有給開發人員準備的最前沿的圖形工具。目前的DirectX 12只是個預覽,僅專注於Direct3D 12,其他技術會在以後揭示。
Q:什麼時候能用上DirectX 12?A:我們的目標是2015年年底的遊戲。
Q:什麼硬件能支持Direct3D 12 /現有的硬件是否可以支持Direct3D 12?A:這需要訪問硬件合作夥伴的網站,他們會宣布能支持Direct3D 12的硬件。

No comments: