关于 c#:laptop 双显卡 – 如何以编程方式检测和/或选择使用哪一个

laptop dual video cards - how to programatically detect and/or choose which one is used

我们正在开发使用 DirectX 在 Windows 7 和更高版本的机器上进行 3D 渲染的软件,64 位 C#/.NET 代码。

我们观察到,我们正在测试的一些较新的戴尔笔记本电脑具有双显卡。他们有 Intel HD 4600 集成显卡,也有更快的 NVIDIA Quadro 卡(例如)。

默认情况下,DirectX 应用程序使用 Intel 显卡。这样做是为了保持电池寿命。但是性能明显比NVIDIA卡差。

使用 NVIDIA 控制面板,用户可以控制默认使用哪一个。一旦用户将其切换为使用 NVIDIA 卡,性能就会大幅提升。

所以,我的问题是....有什么方法可以在代码中检测此设置和/或为我们的应用程序修改它(在安装和/或启动时)?我们能否检测到我们的应用程序正在使用英特尔卡,如果它是这些双卡场景之一,提示用户并可能(如果他们要求)更改他们的设置?

目前我们必须引导用户在 NVIDIA 控制面板中手动进行更改。

其他人有任何处理此问题的经验并对如何进行操作有任何建议吗?


您可以使用 C# DLL Interop 访问作为 GPU 部署工具包 (GDK) 一部分的 NVML(NVidia 管理库)的功能。 NVML 包括以下用于枚举和选择 GPU 设备的函数:

1
2
3
4
5
nvmlInit()
nvmlDeviceGetPciInfo()
nvmlDeviceGetCount()
nvmlDeviceGetHandleByIndex()
nvmlDeviceGetHandleByPciBusId()


nvmlDeviceSetPersistenceMode().

但是,许多 NVML 功能需要管理员访问权限并重新启动才能更改设置。因此,只有在您的用户对此感到满意(可能在初始安装期间)时,这些才是可行的。

更好的选择是枚举 Direct3D 设备并选择最合适的设备:使用 DirectX11 枚举和使用 DirectX9 枚举。


答案是你不能,至少有一些例外。
具有双显卡的笔记本电脑通常附带一个软件,可以手动或自动切换您当前使用的显卡。还有其他的可以自动检测软件应用程序对更大资源的需求,从而自动切换到 nvidia 卡。

但是,有一些解决方法,请参阅此线程。此外,我建议您手动将所有笔记本电脑的默认显卡设置为 nvidia,以消除此问题。