用户抱怨我的应用程序(使用 Direct3D 11 渲染一些沉重的 3D 内容以获得类似 CAD 的功能)在双 GPU 系统上的英特尔 GPU 上运行。
发现
NvOptimusEnablement
/AmdPowerXpressRequestHighPerformance
导出变量。但是,该应用程序有 .NET 前端,无法从那里导出内容。虽然有一些解决方法,但重新编译步骤会破坏调试器(不能再设置断点)并使调试符号无效,我需要它们都能可靠地工作。
还有其他想法吗?
是否可以在安装时创建 nVidia 应用程序配置文件?
或者,如何使用NVApi选择高性能GPU?
我制作了一个带有自定义 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 属性:
然后,调用
NvAPI_DRS_GetProfileInfo
获取应用程序数量,然后调用NvAPI_DRS_EnumApplications
,并搜索EXE路径。
卸载时,我删除了完整的配置文件,通过调用
NvAPI_DRS_FindProfileByName
然后NvAPI_DRS_DeleteProfile
.
在重新安装和升级时我都做,先删除然后添加。
别忘了
NvAPI_DRS_SaveSettings
在最后。
附言最意想不到的是,nVidia 将存储在 NVDRS_APPLICATION::appName 字段中的路径“规范化”,将它们转换为小写,并将
'\'
替换为 '/'
。由于这种“规范化”,没有标准的字符串比较函数适用于它们。