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

DirectX 11:同时使用多个适配器,directx,direct3d11,Directx,Direct3d11,我们需要从一台pc上驱动8到12台显示器,所有显示器都呈现单个3d场景图的不同视图,因此必须使用多个图形卡。我们目前运行的是dx9,所以我们希望迁移到dx11,希望能让这更容易 最初的调查似乎表明,显而易见的方法是行不通的——除非我们从一个单独的过程中驱动每张卡,否则性能很差。网络搜索一无所获。有谁能建议使用dx11从单个进程同时使用多张卡的最佳方法吗?使用IDXGIFactory枚举可用的设备,为每个设备创建一个ID3D11设备,然后从不同的线程馈送它们。应该可以正常工作。也许您不需要升级Di

我们需要从一台pc上驱动8到12台显示器,所有显示器都呈现单个3d场景图的不同视图,因此必须使用多个图形卡。我们目前运行的是dx9,所以我们希望迁移到dx11,希望能让这更容易


最初的调查似乎表明,显而易见的方法是行不通的——除非我们从一个单独的过程中驱动每张卡,否则性能很差。网络搜索一无所获。有谁能建议使用dx11从单个进程同时使用多张卡的最佳方法吗?

使用IDXGIFactory枚举可用的设备,为每个设备创建一个ID3D11设备,然后从不同的线程馈送它们。应该可以正常工作。

也许您不需要升级Directx。

请看。

我知道您已经找到了解决方案,但我认为最好能将我自己最近的经验介绍给其他遇到这个问题的人

是的,您可以从单个进程驱动任意数量的适配器和输出。以下是一些可能有用的信息:

在DXGI和DX11中:

每个图形卡都是一个“适配器”。每个监视器都是一个“输出”。请参阅,以获取有关通过这些枚举的更多信息

有了指向要使用的适配器的指针后,为每个适配器创建一个使用的设备(ID3D11Device)。也许你想要一个不同的线程与你的每个设备进行交互。这个线程可能有一个特定的处理器亲缘关系,如果这有助于加快您的速度

一旦每个适配器有自己的设备,为每个输出创建and。您还可以在处理每个输出的同时,为每个输出执行操作

创建交换链的过程需要设置窗口:每个输出一个窗口。我认为从包含交换链的窗口驱动渲染没有多大好处。您只需将windows创建为交换链的主机,然后完全忘记它们

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

以下是一组链接,在完成此过程时可能会有所帮助:


祝你好运

谢谢阿克塞尔。问题是,当我们这样做时,我们从演示场景中每秒获得大约30帧,但是如果我们从单独的进程驱动每个适配器,那么对于相同的渲染负载,我们可以获得大约600 fps。我们最初的快速试用可能有一个bug,或者在现实世界的示例中,它实际上可以正常工作,但我们担心,我们可能会在渲染器上投入大量精力,结果却发现它必须拆分为多个进程,才能充分发挥适配器的性能。由于我们有一点准备时间,我想我会在这里问一下,几天后再回来……这是D3D9还是D3D11?也可能是驱动程序问题,即每个进程而不是每个线程只创建一个自身实例。您使用什么卡?这是DX11,使用全新的卡,如nVidia GT 220、ATI Radeon HD 6700。注意:GT220不是新卡。甚至都不接近。@Brendan:当然。就我而言,措辞拙劣。我指的是来自两个不同的、相当可靠的制造商,使用最新驱动程序的最新、功能非常强大的DX11图形卡。这不太可能是一个驱动程序/硬件错误,因为我们使用不同的卡获得相同的结果,并且在驱动多个进程时获得了优异的性能。很可能我们驾驶DirectX的方式不对。这似乎是没有人(这里)真正尝试过的。我只需要让我的团队进行进一步的调查,然后如果我们发现了任何问题,就向他们报告。你在使用供应商库吗?一个进程/多个进程的VRAM使用和传输情况如何?您是否在每张卡上运行全屏独占,如果没有,会有什么变化?你是否同时发送帧(多个渲染线程)?@ PaajyRyk:这是用C++的DirectX。我们已经做了一些初始测试,但在一周左右的时间内不会开始核心工作,所以我想现在我应该问这个问题,看看是否有人碰巧知道答案——我们还没有做任何深入的分析或调试。我们需要在窗口模式下运行,因为我们是一个桌面应用程序,每个窗口都独立于自己的线程(渲染速度慢)或进程(渲染速度快)进行渲染。我们可以将渲染拆分为多个进程,但这不是必需的。是否启用了VSync?实际上,我注意到在(几乎)与您相同的用例中出现了一些严重的减速。没有VSync就可以了。@catflier:没有。我们最好的猜测是,造成这种效果的原因是资源锁定导致渲染线程停止(顺便说一句,我们在windows中渲染,而不是全屏渲染,这可能是问题的一部分)。运行相同代码的进程不会产生这种效果。我们的最终解决方案是简单地使用多个进程进行渲染(无论如何,这是一种客户机/服务器设计,如果我们需要的话,它可以分布在多台PC上,所以实现这一点很简单)。谢谢,但现在DX 9已经有近200年的历史了,我们真的想在其中下一个钉子,开始使用DX11功能,避免在所有Win7目标机器上安装DX9等。