DirectX 11:多个适配器的同时使用

9
我们需要从一台电脑驱动8到12个监视器,所有监视器都可以呈现一个单一的3D场景图的不同视角,因此必须使用多张显卡。我们目前正在运行dx9,因此希望转移到dx11以便更加容易实现。
初步调查似乎表明,显而易见的方法行不通——除非我们从不同的进程中驱动每个卡片,否则性能很差。网络搜索没有找到任何结果。有人能建议如何在一个进程内同时利用多张显卡来使用dx11吗?

你是否在使用供应商库?一个处理器/多个处理器的VRAM使用和传输情况如何?您是否在每张卡上运行全屏独占模式,如果没有,这会改变什么吗?您是否同时向所有卡发送帧(多个渲染线程)? - ssube
@peachykeen:这是使用C++中的DirectX。我们已经进行了一些初步测试,但在未来一周左右才会开始核心工作,因此我想现在提出这个问题,看看是否有人恰好知道答案-我们还没有进行任何深入的分析或调试。由于我们是桌面应用程序,所以需要在窗口模式下运行,每个窗口都从自己的线程(渲染速度较慢)或进程(渲染速度快)中独立地进行渲染。我们可以将渲染拆分到多个进程中,但这不应该是必要的。 - Jason Williams
你启用了垂直同步吗?实际上,我在(几乎)与你相同的用例中注意到了一些严重的减速。如果关闭垂直同步,情况会好很多。 - mrvux
@catflier:不是的。我们最好的猜测是由于资源锁定导致渲染线程停滞(顺便说一句,我们在Windows中进行渲染,而不是全屏,这可能是问题的一部分)。使用相同代码运行的进程不会出现此效果。我们的最终解决方案是仅仅使用多个进程进行渲染(它是客户端/服务器设计,因此如果需要可以在许多PC上分布,所以这很容易实现)。 - Jason Williams
3个回答

6
我看到你已经找到了解决方案,但是我认为为了其他人的参考,分享一下我的最近经验会很好……
是的,你可以从单个进程驱动任意数量的适配器和输出。以下是一些有用的信息:
在DXGI和DX11中:
每个显卡都是一个“适配器”。每个显示器都是一个“输出”。请参阅此处以获取有关这些枚举的更多信息。
一旦您获得了要使用的适配器的指针,为每个适配器使用D3D11CreateDevice创建设备(ID3D11Device)。也许您想要为与每个设备交互的每个线程使用不同的线程。如果这有助于提高速度,此线程可能具有特定的处理器亲和性。
一旦每个适配器都有自己的设备,就为每个输出创建交换链渲染目标。同时,在此过程中,您也可以为每个输出创建深度模板视图

创建交换链的过程需要设置窗口:每个输出一个窗口。我认为从包含交换链的窗口进行渲染并没有太多好处。您只需将窗口创建为交换链的宿主,然后在之后完全忘记它们即可。

在渲染时,您需要遍历每个设备的每个输出。对于每个输出,使用OMSetRenderTargets将设备的渲染目标更改为当前输出创建的渲染目标。如果需要,您可以在不同的线程上运行每个设备,因此每个线程/设备对都将进行自己的输出遍历以进行渲染。

以下是一些链接,可能会在这个过程中有所帮助:

DirectX 10每个监视器显示不同的图像

Windows 7上的DXGI和2个以上全屏显示

http://msdn.microsoft.com/en-us/library/windows/desktop/ee417025%28v=vs.85%29.aspx#multiple_monitors

祝你好运!


2

也许你不需要升级DirectX。
请参阅本文


谢谢,但现在DX 9已经接近200年了,我们真的想把它钉死并开始使用DX11功能,避免在所有Win7目标机器上安装DX9等。 - Jason Williams

1
使用IDXGIFactory枚举可用设备,为每个设备创建ID3D11Device,然后从不同的线程中提供它们。应该能正常工作。

谢谢Axel。问题在于,当我们这样做时,从演示场景中获得约30帧每秒,但如果我们从单独的进程驱动每个适配器,则对于相同的渲染负载,我们会获得约600 fps。我们的初步快速试验可能存在错误,或者在实际应用中它可能会正常工作,但我们担心我们可能会花费大量精力来制作渲染器,只发现必须将其分成多进程才能充分发挥适配器的性能。由于我们有一些领先时间,所以我想在这里问一下,并在几天后回来... - Jason Williams
这是DX11,使用像nVidia GT 220、ATI Radeon HD 6700这样全新的显卡。 - Jason Williams
1
@Brendan:当然。我表达不清楚了。我的意思是来自两个相当可靠的制造商、使用最新驱动程序的当前非常有能力的DX11图形卡。这不太可能是驱动程序/硬件错误,因为我们使用不同的卡片得到相同的结果,并且在驱动多个进程时性能优秀。更有可能的是我们没有正确地驱动DirectX。看起来这是没有人(这里)真正尝试过的东西。我将让我的团队进一步调查,如果我们发现了什么,就会回报。 - Jason Williams
GT220支持DX11吗?我不太确定,但如果您正在使用它,我相信它是支持的。只是想确保您没有使用不兼容的显卡。 - Brendan Lesniak
@Brendan GT220是DX10.1,因此您可以在dx11中使用它,并使用10_1功能集。 - mrvux
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接