为 .NET 应用启用高性能 GPU
Enable high-performance GPU for a .NET app
用户抱怨我的应用程序(使用 Direct3D 11 渲染一些沉重的 3D 内容以获得类似 CAD 的功能)在双 GPU 系统上的 Intel GPU 上运行。
发现 NvOptimusEnablement
/ AmdPowerXpressRequestHighPerformance
导出了变量。但是,该应用程序有 .NET 前端,无法从那里导出内容。虽然 there’s some workaround,重新编译步骤会破坏调试器(不能再设置断点)并使调试符号无效,但我需要它们都能可靠地工作。
还有其他想法吗?
是否可以在安装时创建 nVidia 应用程序配置文件?
或者,我如何使用 NVApi select 高性能 GPU?
我制作了一个带有自定义 WIX 操作的 C++ DLL,creates/updates 安装时应用程序的配置文件,并在卸载时删除它。
虽然几乎没有记录,但官方 nVidia API 具有所需的 NvAPI_DRS_* 功能。
这是一个工作流程:NvAPI_Initialize
(如果失败则表示用户没有 nVidia GPU,这不是错误),NvAPI_DRS_CreateSession
、NvAPI_DRS_LoadSettings
、NvAPI_DRS_FindProfileByName
.
如果未找到,NvAPI_DRS_CreateProfile
,并三次调用 NvAPI_DRS_SetSetting
,设置三个 DWORD 属性:
- SHIM_MCCOMPAT_ID = SHIM_MCCOMPAT_ENABLE
- SHIM_RENDERING_MODE_ID = SHIM_RENDERING_MODE_ENABLE
- SHIM_RENDERING_OPTIONS_ID = SHIM_RENDERING_OPTIONS_DEFAULT_RENDERING_MODE
然后,调用NvAPI_DRS_GetProfileInfo
获取应用程序数量,然后调用NvAPI_DRS_EnumApplications
,并搜索EXE路径。
卸载时,我通过调用 NvAPI_DRS_FindProfileByName
然后 NvAPI_DRS_DeleteProfile
.
删除了完整的配置文件
在重新安装和升级时,我会同时进行,先删除再添加。
不要忘记最后的NvAPI_DRS_SaveSettings
。
P.S。最意想不到的是,nVidia 将存储在 NVDRS_APPLICATION::appName 字段中的路径“规范化”,将它们转换为小写,并将 '\'
替换为 '/'
。由于这种“规范化”,没有标准的字符串比较函数对它们有效。
用户抱怨我的应用程序(使用 Direct3D 11 渲染一些沉重的 3D 内容以获得类似 CAD 的功能)在双 GPU 系统上的 Intel GPU 上运行。
发现 NvOptimusEnablement
/ AmdPowerXpressRequestHighPerformance
导出了变量。但是,该应用程序有 .NET 前端,无法从那里导出内容。虽然 there’s some workaround,重新编译步骤会破坏调试器(不能再设置断点)并使调试符号无效,但我需要它们都能可靠地工作。
还有其他想法吗?
是否可以在安装时创建 nVidia 应用程序配置文件?
或者,我如何使用 NVApi select 高性能 GPU?
我制作了一个带有自定义 WIX 操作的 C++ DLL,creates/updates 安装时应用程序的配置文件,并在卸载时删除它。
虽然几乎没有记录,但官方 nVidia API 具有所需的 NvAPI_DRS_* 功能。
这是一个工作流程:NvAPI_Initialize
(如果失败则表示用户没有 nVidia GPU,这不是错误),NvAPI_DRS_CreateSession
、NvAPI_DRS_LoadSettings
、NvAPI_DRS_FindProfileByName
.
如果未找到,NvAPI_DRS_CreateProfile
,并三次调用 NvAPI_DRS_SetSetting
,设置三个 DWORD 属性:
- SHIM_MCCOMPAT_ID = SHIM_MCCOMPAT_ENABLE
- SHIM_RENDERING_MODE_ID = SHIM_RENDERING_MODE_ENABLE
- SHIM_RENDERING_OPTIONS_ID = SHIM_RENDERING_OPTIONS_DEFAULT_RENDERING_MODE
然后,调用NvAPI_DRS_GetProfileInfo
获取应用程序数量,然后调用NvAPI_DRS_EnumApplications
,并搜索EXE路径。
卸载时,我通过调用 NvAPI_DRS_FindProfileByName
然后 NvAPI_DRS_DeleteProfile
.
在重新安装和升级时,我会同时进行,先删除再添加。
不要忘记最后的NvAPI_DRS_SaveSettings
。
P.S。最意想不到的是,nVidia 将存储在 NVDRS_APPLICATION::appName 字段中的路径“规范化”,将它们转换为小写,并将 '\'
替换为 '/'
。由于这种“规范化”,没有标准的字符串比较函数对它们有效。