悦民生活
欢迎来到悦民生活,了解生活趣事来这就对了

首页 > 趣味生活 正文

directx12(深入探究DirectX12技术)

冰糕就蒜 2024-01-24 10:43:16 趣味生活260

深入探究DirectX12技术

DirectX12是微软所推出的最新版DirectX图形API,它具备多线程优化等众多良好特性,本文将深入探究其技术实现,以及为什么它对游戏行业有着重大的影响。

DirectX12的特点

相较于之前的版本,DirectX12最突出的新特性就是多线程优化,具体来讲,它的多线程优化主要体现在以下两点。

第一,Direct3D12(其实DirectX12主要就是Direct3D12和DirectCompute两部分组成)中的drawcall调用比以前更高效,这主要得益于新一代的命令列表方式。在传统的渲染中,CPU通过一条条指令控制GPU渲染,这条指令的执行等待在GPU的执行。而命令列表方式可以把几个指令打包成一个列表,将多个命令同时提交给GPU执行,从而让CPU、GPU之间的空闲时间降低。同时,指令列表中的内容是APP层构造好的,GPU甚至不需要区分指令类型,这样也减小了CPU到GPU的带宽要求。新的指令列表方式可以让高速的GPU渲染器不受CPU的限制而充分发挥性能,从而极大地提高了性能的利用率。

第二,Direct3D12还支持显式多线程,在以前的版本中,虽然可以使用多线程编程去优化一些计算型的任务,但是当需要进行drawcall调用时,并没有这种方式。而在Direct3D12中,这种方式成为了标准,我们可以启动多线程去并行地处理大量的drawcall调用,从而缩短CPU瓶颈产生的时间,尽可能地最大化性能收益。

DirectX12的实现原理

在上一节所讲的两个主要特性中,multithreading性能的提升更是让人感到不可思议。它是怎么实现的呢?其实,DirectX12的实现原理可以这样概括:

在DirectX12中,CPU(主机端)和GPU(设备端)之间的通信是使用多个命令队列来实现的,它们在两端分别被插入到一个队列里。这些队列支持执行命令的并行线程,CPU通过这个队列来发出绘制命令,GPU重新排列这个可以实现更高效绘画的命令流程。

DirectX12还实现了命令缓冲池,具体就是将多个绘画命令缓存并打包成同一大命令池进行处理,可使CPU将绘制命令随机钩到可用的命令池中,以减轻CPU->GPU插入统一命令队列的带宽负担。

上述的两个实现思路既提高了DirectX12的CPU占用率,又在GPU上实现了并行渲染,保持了多个CPU线程进行绘画过程的同步性。下面,我们来简单探究一下DirectX12是怎么做到支持显式的多线程。

DirectX12的显式多线程优化之所以这么棒,其中主要的原因就在于GPU的资源管理。如同上文所讲,GPU接收到的绘画命令是一步一步来的,GPU在CommandList里面并行的绘制。那么在这里,GPU能够为CPU启动多个进程来插入不断的命令流,并在同一时间段内进行命令列表的处理和资源的测量。

直接让CPU去管理GPU的资源是不现实的,更何况这样也根本没必要。DirectX12允许让程序员释放和同步资源(例如显存等),而不用去发送一些耗费数量可观的等待命令从而显著降低帧速率。相反,DirectX12使用异步GPU计算,然后在使用命令流的末尾等待GPU完成当前的运算。

DirectX12的未来

在DirectX12推出之后,它很快就在游戏开发领域产生了深远的影响。任天堂与PC生态的概念有所重合,这便可感受到它对游戏产业的推动意义。虽然它的技术深奥难度大,但随着现有显卡的升级换代、耗电量优化,以及越来越完善的DX12工具集,我们相信它会为我们的游戏开发带来更多的惊喜与可能。

伴随着微软与其他技术开发企业针对DX12的竞争与挑战,我们可以想象,在未来,DX12的功能与尝试一定会越来越多。我们期待着它在未来的千秋岁月里继续不断地创新,为我们游戏开发者和玩家带来更多的惊喜!

猜你喜欢