我们需要从一台 pc 驱动 8 到 12 台显示器,所有显示器都渲染单个 3d 场景图的不同视图,因此必须使用多个显卡。我们目前在 dx9 上运行,因此正在寻求迁移到 dx11 以希望使这更容易。
初步调查似乎表明,显而易见的方法是行不通的——除非我们从单独的进程中驱动每张卡,否则性能很差。网络搜索一无所获。任何人都可以建议使用 dx11 从单个进程同时使用多张卡的最佳方法吗?
我们需要从一台 pc 驱动 8 到 12 台显示器,所有显示器都渲染单个 3d 场景图的不同视图,因此必须使用多个显卡。我们目前在 dx9 上运行,因此正在寻求迁移到 dx11 以希望使这更容易。
初步调查似乎表明,显而易见的方法是行不通的——除非我们从单独的进程中驱动每张卡,否则性能很差。网络搜索一无所获。任何人都可以建议使用 dx11 从单个进程同时使用多张卡的最佳方法吗?
我看到您已经找到了解决方案,但我认为最好将我自己最近的经验提供给遇到这个问题的其他人......
是的,您可以从单个进程驱动任意数量的适配器和输出。以下是一些可能有用的信息:
在 DXGI 和 DX11 中:
每张显卡都是一个“适配器”。每个监视器都是一个“输出”。有关通过这些枚举的更多信息,请参见此处。
一旦有了指向要使用的适配器的指针,就可以使用D3D11CreateDevice为每个适配器创建一个设备 (ID3D11Device)。也许您想要一个不同的线程来与您的每个设备进行交互。如果这有助于为您加快处理速度,该线程可能具有特定的处理器亲和性。
一旦每个适配器都有自己的设备,就为每个输出创建一个交换链和渲染目标。您还可以在使用时为每个输出创建深度模板视图。
创建交换链的过程需要设置您的窗口:每个输出一个窗口。我认为从包含交换链的窗口驱动渲染没有太多好处。您可以将窗口创建为交换链的主机,然后完全忘记它们。
对于渲染,您需要遍历每个设备的每个输出。对于每个输出,将设备的渲染目标更改为您使用OMSetRenderTargets为当前输出创建的渲染目标。同样,如果您愿意,您可以在不同的线程上运行每个设备,因此每个线程/设备对将通过输出进行渲染有自己的迭代。
以下是一些在完成此过程时可能会有所帮助的链接:
http://msdn.microsoft.com/en-us/library/windows/desktop/ee417025%28v=vs.85%29.aspx#multiple_monitors
祝你好运!
也许您不需要升级 Directx。
见这篇文章。
使用 IDXGIFactory 枚举可用设备,为每个设备创建一个 ID3D11Device,然后从不同的线程提供它们。应该可以正常工作。