虽然超线程概念已经在CPU领域发展了数十年,但大多数程序员还是直到近年来多核心CPU流行之后才开始关心程序的平行化,在此之前大部分通用代码都是简单的单线程,在这些代码里寻找并挖掘多线程化带来的性能提升是非常困难的。
为了改变这一现状,DirectX 11特性还包括很重要一点:支持多线程(multi-threading)。没错,无论是DirectX 10还是DirectX 11,所有的色彩信息最终都将被光栅化并显示在电脑显示屏上(无论是通过线性的方式还是同步的),但是DirectX 11新增了对多线程技术的支持。
从DirectX 10到DirectX 11的多线程变化
得益于此,应用程序可以同步创造有用资源或者管理状态,并从所有专用线程中发送提取命令,这样做无疑效率更高。DX11的这种多线程技术可能并不能加速绘图的子系统(特别是当我们的GPU资源受限时),但是这样却可以提升线程启动游戏的效率,并且可以利用台式CPU核心数量不断提高所带来的潜力。
多线程渲染示意图1
在DirectX 11中,微软通过将目前单一执行的Direct 3D设备被分为三个独立的接口:设备(Device)、立即执行范畴(immediate Context)和延迟执行范畴(Deferred Context)。
多线程渲染示意图2
这三者都被分发到各自独立的线程,而且设备和Deferred context还可以分配多个线程,负责将等待执行的任务发送给immediate Context或渲染线程。这样的设计可以将图形生成所需的资源做预先的存取。同时,CPU还可以利用显卡的多线程处理加快DirectX的处理,减少CPU的响应时间而使游戏不再受到CPU的瓶颈限制。