DirectX 12開發(1)

NO IMAGE

DirectX 12 概述

  DirectX 12是微軟在2014年的GDC上正式釋出了新一代的圖形API。DX12搭載在最新的作業系統Windows 10上。相比之前的版本,Direct3D 12 更快更有效,可以支援更豐富的場景,更多 的物體,更酷炫的特性,能夠充分利用主流 GPU。

新特性

Work submission

  當程式給GPU提交渲染任務(work submission)時,Direct3D 12給與程式很高的控制權。程式首先會記錄渲染指令到指令列表(command lists)裡,然後提交這些指令列表到一個GPU的指令佇列(command queque)中。Direct3D 12支援CPU多執行緒來同時處理多指令列表的記錄。當然,指令列表提交至指令佇列的過程也是執行緒自由的。

  指令列表提交後的執行對於CPU來說是非同步的。也就是,當程式提交指令列表到指令佇列後,CPU不會等命令的執行,而是直接回到程式中。這樣就可以保證CPU在任何時刻都能提交大量的渲染 指令列表。Direct3D 12提供了在CPU和GPU之間的同步通訊原語(synchronization primitives)用來獲知GPU執行渲染任務的進展。

Memory Management

  Direct3D 12 API所處理的資料儲存在被稱為資源堆(resource heap)的記憶體物件上。
資源堆可以存在於本地視訊記憶體或系統記憶體中,並有一定的快取(cache)、CPU可訪問或者GPU可訪問等的特性。一個應用可以通過使用各種堆建立API的引數來控制資源堆記憶體的屬性和配置。

  在一個資源堆內,程式可以自由地分配資源,比如紋理和緩衝(buffer)。這是一個相對輕量級的操作,在一個現有的資源堆裡建立資源是不產生實際的記憶體分配操作的。為了讓GPU能正確地訪問這些資源,應用程式需要建立資源描述符檢視(descriptor views),比如:著色器資源檢視(shader resource views)或無序訪問檢視(unordered access views)。

  為了讀取或寫入CPU的資源堆記憶體,應用程式必須對映一個基於堆的資源用於 CPU 訪問。在Diect3D 12中,為了確保GPU記憶體分配資料的連續性以及在流水線操作中的正確,一般採用環形緩衝(ring buffer)或相類似的技術。API提供了同步原語確保這種型別的流水線操作。

程式設計模型

  一個DX12的應用程式的最基本套路:

Initialize();
while(!exit)
{
Update();
Render();
}
Release();

和以前的D3D應用程式類似,在Initialize()中執行初始化,在Update()中更新程式邏輯,在Render()中提交渲染命令,在Release()中釋放回收資源。

參考

《DX12 Whitepaper》