关于D3D11,你必须了解的几件事情(二)

摘要:
ComputeShadercomputeshader是D3D11新增的主要功能之一。相信用过CUDA2.0之前的朋友也了解这件事情)结果就是无法把CS4.x用于postprocess这样的操作。Multi-threadedD3D11加入了显式的multi-threaded支持。它把D3D10的接口分成两部分。负责建立资源的那些函数属于ID3D11Device,剩下的都分到了ID3D11DeviceContext。ID3D11DeviceContext是没有线程安全的,得由上层代码自己处理。目前不论是D3D11还是D3D10级别的,都不支持Multi-threaded,所有的deferredcontext都是软件实现的,所以性能并无提高、反而降低。
转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2011/08/12/%e5%85%b3%e4%ba%8ed3d11%ef%bc%8c%e4%bd%a0%e5%bf%85%e9%a1%bb%e4%ba%86%e8%a7%a3%e7%9a%84%e5%87%a0%e4%bb%b6%e4%ba%8b%e6%83%85%ef%bc%88%e4%ba%8c%ef%bc%89/

上文介绍了feature level和option features这两个最容易被误解的D3D11特性,本篇主要探讨一下另外两个重要特性,compute shader和multi-threaded。他们同样可以在D3D10级别硬件上使用,但存在很多细节需要注意。

Compute Shader

compute shader(也叫DirectCompute)是D3D11新增的主要功能之一。在D3D11的GPU上,compute shader是完整的5.0版本,而在D3D10.x的GPU上,compute shader有个简化的4.x版。两者的具体差别请见Compute Shaders on Downlevel Hardware

CS 4.x的一个很重要缺点是不支持RWTexture,所以shader无法写入texture,只能写入buffer。(这是NV造成的。AMD的硬件很 早就可以做到写入RWTexture,但因为CS 4.x要求同时兼容NV和AMD,所以就放弃了写入RWTexture的要求。相信用过CUDA 2.0之前的朋友也了解这件事情)结果就是无法把CS 4.x用于post process这样的操作。有个解决方案是compute shader的结果都写到buffer,要让图形流水线用的时候调用一个pixel shader来把buffer转到texture中。CS 4.x可以把texture和buffer作为输入、buffer作为输出,而D3D11下的PS 4.x可以把texture和buffer作为输入、texture作为输出,所以可以把两者结合来实现从texture到texture的流水线。

但是,不管是CS 4.x还是5.0,从CS转回图形流水线的时候,在NV的卡上都会出现一个明显的几毫秒延迟。所以每一帧的切换次数要尽量减少。在AMD卡完全没这个问题。

CS 4.x还有一个重要缺点,每个thread虽然可以读任意地址的shared memory,但只能写入自己对应的shared memory单元,所以没办法用CUDA里面常用的stride布局。(这是AMD的实现限制。还是因为有兼容的要求,所以就算NV能做到也不行了)常见 的做法是,声明一个结构体,里面有自己要用到的所有共享变量。用这样的结构体来声明shared memory,就可以写入多个值。

Multi-threaded

D3D11 加入了显式的multi-threaded支持。它把D3D10的接口分成两部分。负责建立资源的那些函数属于ID3D11Device,剩下的都分到了 ID3D11DeviceContext。ID3D11Device是线程安全的,如果驱动不支持并行建立资源,runtime就会通过加锁来保证线程安 全(除非用D3D11_CREATE_DEVICE_SINGLETHREADED来强制关闭这一点)。ID3D11DeviceContext是没有线 程安全的,得由上层代码自己处理。

D3D11的device context分为Immediate Context和Deferred Context两种。Immediate context的命令都会立刻得到执行,deferred context则是把命令存在列表里,等他被提交的时候才开始执行。因为在调用Draw的时候,CPU需要做一些额外的事情,所以如果Draw call被分散到多个core去执行,是会有性能提升的。

Deferred Context

高性能地使用这 个多线程是需要驱动支持的。现在的GPU一般都有多个command unit,但驱动往往不开放多线程的功能。目前不论是D3D11还是D3D10级别的,都不支持Multi-threaded,所有的deferred context都是软件实现的,所以性能并无提高、反而降低。希望某天驱动能完善到支持它的程度,这才能真正让开发人员用上高效的deferred context。

本篇到此为止,下一篇会讲tessellation和新的纹理压缩格式。

免责声明:文章转载自《关于D3D11,你必须了解的几件事情(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇winform里面打开网页(转)百度音乐搜索API介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

go笔记-限速器(limiter)

参考:https://blog.csdn.net/wdy_yx/article/details/73849713https://www.jianshu.com/p/1ecb513f7632 https://studygolang.com/articles/13254 "golang.org/x/time/rate" golang 提供上述包 用来对速...

Tomcat模型结构

一、请求过程 Tomca的两大组件:Connecter和Container Connecter组件 1、Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response...

分享api接口验证模块

一.前言   权限验证在开发中是经常遇到的,通常也是封装好的模块,如果我们是使用者,通常指需要一个标记特性或者配置一下就可以完成,但实际里面还是有许多东西值得我们去探究。有时候我们也会用一些开源的权限验证框架,不过能自己实现一遍就更好,自己开发的东西成就感(逼格)会更高一些。进入主题,本篇主要是介绍接口端的权限验证,这个部分每个项目都会用到,所以最好就是也...

*引使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法。

最近在做我们单位的内部一个系统,使用了类似于Asp.Net 2.0里面的Theme(主题)的功能。此功能的核心是一个动态的CSS定义,根据用户选择的不同主题内容来发送不同的CSS样式文本。 本来这个问题很好解决,在HTML中的<head>区内使用一个: <%#=base.GetCssInclude()%> 就可以解决,不过我没有...

(转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)

在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix。它其实是一个uniform,每一个cocos2d-x预定义的shader都包含有这个uniform, 但是如果你在shader里面不使用这个变量的话,OpenGL底层会把它优化掉。 但是,CC_MVPMatrix是在什么时候设置进来的呢?我在shader里面明...

【Android】WebDav For Android

最近在写一个云备份功能,参考了一下市面上的软件,发现有一种采用WebDav协议的云备份成本比较低,故特地研究一下使用。 服务器提供商是使用国内的坚果云,还是非常良心的。 坚果云官网:https://www.jianguoyun.com 注册账号后,点击账户信息,安全选项中即可看到 第三方应用管理 这里需要三个东西,服务器地址、账户、密码(这个密码是你为应用...