为 .NET 应用启用高性能 GPU

问题描述 投票:0回答:1

用户抱怨我的应用程序(使用 Direct3D 11 渲染一些沉重的 3D 内容以获得类似 CAD 的功能)在双 GPU 系统上的英特尔 GPU 上运行。

发现

NvOptimusEnablement
/
AmdPowerXpressRequestHighPerformance
导出变量。但是,该应用程序有 .NET 前端,无法从那里导出内容。虽然有一些解决方法,但重新编译步骤会破坏调试器(不能再设置断点)并使调试符号无效,我需要它们都能可靠地工作。

还有其他想法吗?

是否可以在安装时创建 nVidia 应用程序配置文件?

或者,如何使用NVApi选择高性能GPU?

c# c++ windows nvidia
1个回答
3
投票

我制作了一个带有自定义 WIX 操作的 C++ DLL,它在安装时创建/更新应用程序的配置文件,并在卸载时删除它。

虽然几乎没有记录,但官方 nVidia API 具有所需的 NvAPI_DRS_* 函数。

这是一个工作流程:

NvAPI_Initialize
(如果失败则意味着用户没有 nVidia GPU,这不是错误),
NvAPI_DRS_CreateSession
NvAPI_DRS_LoadSettings
NvAPI_DRS_FindProfileByName
.

如果没有找到,

NvAPI_DRS_CreateProfile
,然后三次调用
NvAPI_DRS_SetSetting
,设置三个 DWORD 属性:

  1. SHIM_MCCOMPAT_ID = SHIM_MCCOMPAT_ENABLE
  2. SHIM_RENDERING_MODE_ID = SHIM_RENDERING_MODE_ENABLE
  3. 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
在最后。

附言最意想不到的是,nVidia 将存储在 NVDRS_APPLICATION::appName 字段中的路径“规范化”,将它们转换为小写,并将

'\'
替换为
'/'
。由于这种“规范化”,没有标准的字符串比较函数适用于它们。

© www.soinside.com 2019 - 2024. All rights reserved.