译者:林公子

出处:木木的二进制人生

转载请注明作者和出处,谢谢!

这是微软公布的Direct3D 12文档的其中一篇,此翻译留作学习记录备忘,水平有限,错漏难免,还望海涵。   

  原文链接是https://msdn.microsoft.com/en-us/library/windows/desktop/dn899194(v=vs.85).aspx

Direct3D 12到Direct3D 11的重大改变

Direct3D 12是对Direct3D 11编程模型的一个巨大颠覆。Direct3D 12让应用程序比以往更接近硬件底层。通过接近底层,Direct3D 12更加的快速和高效。不过你的应用程序使用Direct3D 12带来的速度和效率提升相应的代价是你要比使用Direct3D 11负责更多的工作。

Direct3D 12是底层编程的回归。通过引入这些新特性,它给予你对游戏和应用程序中图形元素的更多的控制: 用于代表管线整体状态的的对象,用于任务提交的command list和bundles,用于资源访问的descriptor heap/table。

Direct3D 12 vs Direct3D 11的取舍

使用Direct3D 12你的应用程序的速度和效率得到了提升,不过你要负责相对与Direct3D 11更多的工作。

在Direct3D 12中,CPU-GPU的同步明确由应用程序负责,不再像Direct3D 11中由运行时隐式执行。这也意味着Direct3D 12没有对pipeline hazard的自动检查,因此这也成为了应用程序的职责。

在Direct3D 12中,应用程序负责管线数据更新。也就是Direct3D 11中的"Map/Lock-Discard"模式在Direct3D 12中必须手动进行。在Direct3D 11中,当你使用D3D11_MAP_WRITE_DISCARD标识调用ID3D11DeviceContext::Map时,运行时返回一个新内存区块的指针代替旧的缓冲数据。这让GPU能够在应用程序往新缓冲填充数据的同时使用旧的数据。应用程序不需要额外的内存管理。旧的缓冲在GPU使用完后会自动销毁或重用。

在Direct3D 12中,所有的动态更新(包括constant buffer,dynamic vertex buffer,dynamic textures等等)明确由应用程序来控制。这些动态更新包括任何请求的GPU fence和buffer。应用程序有责任保证内存在使用完之前是有效的。

Direct3D 12只将COM风格的引用计数用于interface的生命周期(通过Direct3D的弱引用模型关联到device的生命周期)。所有的resource和description内存生命周期由应用程序来负责保证适当的存活时间,而且它们都没有使用引用计数。Direct3D 11也使用引用计数来管理interface相关的对象。

管线状态对象

Direct3D11允许使用大量独立的对象的集合来操纵管线状态。例如,input assembler state,pixel shader state,rasterizer state和output merge state都能够独立的进行修改。这种设计提供了便利性和相对高层的图形管线表示。但是没有利用现代硬件的能力。主要是各种各样的state通常是互相关联的。例如,很多GPU将pixel shader和output merger state合并为一个硬件表示。然而因为Direct3D 11 API这些管线阶段状态被分别设置,显示驱动不能决议管线状态直到状态最后确定下来,而这要等到绘制的时候。这种规划延迟了硬件的状态设置,也就意味着额外的开销和更少的每帧DP。

Direct3D 12通过将大部分管线状态统一到不可变的管线状态对象(PSOs)来解决这个问题,PSOs在创建的时间就决定了。硬件和驱动能够立即将PSO转换为用来驱动GPU工作的硬件本地指令和状态。你仍然可以动态切换使用的PSO。这么做硬件只需要直接拷贝最少的预计算状态到硬件寄存器,而不是实时计算硬件状态。通过使用PSOs,DP的开销显著的减少,然后每帧可以有更多的DP。更多关于PSOs的信息见Managing graphics pipeline state in Direct3D 12. 。

命令列表和集合(bundle)

在Direct3D 11中,所有的任务提交都通过immediate context完成,immediate context代表了一条送往GPU的指令流。要实现多线程,游戏还有deferred context可以使用。Direct3D 11中的Deferred Context不能完美的映射到硬件,所以它们能做的事情有限。

Direct3D 12引入了给予命令列表的任务提交模型。命令列表包含了在GPU上执行一个具体工作所需的所有信息。每个命令列表包含的信息有使用哪个PSO,需要什么纹理和缓冲资源和所有DP的参数。因为每个命令列表是自包含的并且没有状态继承。驱动能够预先计算所有需要的GPU命令,并且是以一种自由线程化(free-threaded)的方式。接下来唯一需要进行的处理是通过命令队列将命令列表最终提交到GPU。

除了命令列表,Direct3D 12还引入了一个二级的任务预计算方式:bundle。不像命令列表,完全的自包含,一般性的被构造,提交一次然后丢弃,bundle提供了某种形式的状态继承来允许复用。例如,如果游戏想要用不同的纹理绘制两个角色模型。一种方法是用一个命令列表记录两组完整一样的DP。另一种方法是记录一个绘制单一角色模型的bundle,然后用不同的资源在命令列表上“回放”bundle两次。在后一种情况下,显示驱动只需要计算相应的指令一次,而创建命令列表本质上相当于两个低开销的函数调用。

描述符堆和表(Descriptor Heap and Table)

Direct3D 11中的资源绑定高度抽象和便利,却留下很多现代硬件能力没有被利用到。在Direct3D 11中,游戏创建资源的视图对象,然后绑定这些视图到管线中不同shader阶段的slot中。然后Shader从显式绑定的 slot读取数据,这些绑定slot在绘制时是固定的。这个模型意味着每当游戏使用不同的资源绘制,它必须重新绑定不同的视图到不同的slot,然后再次调用绘制函数。这种情况也表现出额外的开销能够通过完全利用硬件能力来消除。

Direct3D 12改变了绑定模型来匹配现代硬件并显著的提升了性能。和需要独立的资源视图和显式的绑定到slot相反,Direct3D 12提供了一个descriptor heap用来创建游戏中不同的资源。这个方案提供了一种机制让GPU预先直接写入硬件本地资源描述(descriptor)到内存。因为descriptor heap已经被恰当的特定于硬件的descriptor数据填充,改变descriptor table是消耗相当低的操作

除了由descriptor heap和table带来的性能提升。Direct3D 12还允许资源在shader里被动态的索引,这提供了空前的灵活性并开启了新渲染技术的大门。举例来说,现代延迟渲染引擎一般将一个某种形式的材质或物体标识符编码到中间的G-Buffer。在Direct3D 11中,这些引擎必须小心的避免使用太多的材质,因为在一个G-Buffer中包含太多会极大的影响最终渲染pass的速度。有了能动态索引的资源,一个有上千材质的场景能够最终和只有十个材质的场景一样快。

更多关于descriptor head和table的信息,见Resource Binding

【译】Import Changes from Direct3D 11 to Direct3D 12的更多相关文章

  1. [转]Direct3D 11 Tessellation Tutorial

    The new hardware tessellation feature available on Direct3D 11 video cards has great potential, but ...

  2. Direct3D 11 Tutorial 7:Texture Mapping and Constant Buffers_Direct3D 11 教程7:纹理映射和常量缓冲区

    概述 在上一个教程中,我们为项目引入了照明. 现在我们将通过向我们的立方体添加纹理来构建它. 此外,我们将介绍常量缓冲区的概念,并解释如何使用缓冲区通过最小化带宽使用来加速处理. 本教程的目的是修改中 ...

  3. Direct3D 11 Tutorial 5: 3D Transformation_Direct3D 11 教程5:3D转型

    概述 在上一个教程中,我们从模型空间到屏幕渲染了一个立方体. 在本教程中,我们将扩展转换的概念并演示可以通过这些转换实现的简单动画. 本教程的结果将是围绕另一个轨道运行的对象. 展示转换以及如何将它们 ...

  4. Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间

    概述 在上一个教程中,我们在应用程序窗口的中心成功渲染了一个三角形. 我们没有太注意我们在顶点缓冲区中拾取的顶点位置. 在本教程中,我们将深入研究3D位置和转换的细节. 本教程的结果将是渲染到屏幕的3 ...

  5. Direct3D 11 Tutorial 3: Shaders and Effect System_Direct3D 11 教程3:着色器和效果系统

    概述 在上一个教程中,我们设置了一个顶点缓冲区并将一个三角形传递给GPU. 现在,我们将逐步完成图形管道并查看每个阶段的工作原理. 将解释着色器和效果系统的概念. 请注意,本教程与前一个源代码共享相同 ...

  6. Direct3D 11 Tutorial 2: Rendering a Triangle_Direct3D 11 教程2:渲染一个三角形

    概要 在之前的教程中,我们建立了一个最小的Direct3D 11的应用程序,它用来在窗口上输出一个单一颜色.在本次教程中,我们将扩展这个应用程序,在屏幕上渲染出一个单一颜色的三角形.我们将通过设置数据 ...

  7. Direct3D 11 Tutorial 1: Basics_Direct3D 11 教程1:基础

    Github-LearnDirectX-DX3D11 tutorial01 概述 在这第一篇教程中,我们将通过介绍创建最小Direct3D应用程序所必需的元素.每一个Direct3D应用程序必需拥有这 ...

  8. WeihanLi.Npoi 1.11.0/1.12.0 Release Notes

    WeihanLi.Npoi 1.11.0/1.12.0 Release Notes Intro 最近 NPOI 扩展新更新了两个版本,感谢 shaka chow 的帮忙和支持,这两个 Feature ...

  9. 【C++】使用 libass,完成 Direct3D 11 下的字幕渲染

    前言 前段时间曾经写过一个视频播放器:https://www.cnblogs.com/judgeou/p/14746051.html . 然而这个播放器却无法显示出外挂或者内封的字幕,这里要稍微解释一 ...

随机推荐

  1. ajax 通用方法,从thinkphp中拔出来的

    <?php /** * 设置页面输出的CONTENT_TYPE和编码 * @access public * @param string $type content_type 类型对应的扩展名 * ...

  2. rabbitmq使用心得

    因为公司项目需要使用消息中间件,实现相关业务的异步处理,所有选用了rabbitmq.通过看文档,爬过一个一个坑,终于还是实现了相关功能. 直接上配置文件: <?xml version=" ...

  3. Ubuntu 设置当前用户sudo免密码

    方法1 # 备份 /etc/sudoers sudo cp /etc/sudoers . #打开 /etc/sudoers sudo visudo # 在文件末尾加入 kube ALL=NOPASSW ...

  4. 如何用shared_ptr减少锁的争用

    在并发环境下锁的使用是家常便饭, 如何减少锁的使用是优化程序性能的一个方面. c++11里面新增了智能指针std::shared_ptr, 这个东西也许能给我们带来些启发. shared_ptr的一个 ...

  5. mysql导入大文件sql

    备份mysqldump mysqldump -u root -p ao2012 > /mnt/www/zq_ao2012/backup.sql 然后数据库密码 导入 mysql -h local ...

  6. java基础总结——基础语法2(语句)

    1.1.       判断语句(if语句) 1.1.1. If语句的三种格式: 1.1.2. if语句特点: 每一种格式都是单条语句(单条不是单行,单条是一个整体). 第二种格式与三元运算符的区别:三 ...

  7. openstack中eventlet使用

    openstack中使用eventlet的协程来实现并发. 第一种,使用eventlet.GreenPool来管理绿色线程 如l3-agent在开启了8个绿色线程来处理router消息 def _pr ...

  8. flot - jQuery 图表插件(jquery.flot)使用

    Flot是纯Javascript实现的基于jQuery的图表插件,主要支持线状图和柱状图的绘制(通过插件也可以支持饼状图). 特别注意Flot使用的是UTC时间,最好修改flot.js去掉所有的UTC ...

  9. 如何发布一个Mac应用并使其成为全球付费榜第一

    Readdle公司如何发布第一个 Mac App,并使之成为Mac App Store 全球付费排名第一的 Easy注:自从发布了<程序员如何优雅的挣零花钱?>后,就不断有同学询问怎么做A ...

  10. c#项目架构搭建经验

    读过.Net项目中感觉代码写的不错(备注1)有:bbsMax(可惜唧唧喳喳鸟像消失了一样),Umbraco(国外开源的cms项目),Kooboo(国内做开源cms).本人狭隘,读的代码不多,范围也不广 ...