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》


望月剑仙
53 声望15 粉丝