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()中释放回收资源。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。