用户提示我的应用程序(使用 Direct3D 11 渲染一些重型 3D 内容以获得类似 CAD 的功能)在双 GPU 系统上的 Intel GPU 上运行。
发现 NvOptimusEnablement
/AmdPowerXpressRequestHighPerformance
导出了变量。但是,该应用程序有 .NET 前端,无法从那里导出内容。同时there’s some workaround ,重新编译步骤会破坏调试器(不能再设置断点)并使调试符号无效,我需要它们都可靠地工作。
还有其他想法吗?
是否可以在安装时创建 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 属性:
- 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
。
附言最意想不到的是,nVidia 将存储在 NVDRS_APPLICATION::appName 字段中的路径“规范化”,将它们转换为小写,并将 '\'
替换为 '/'
。由于这种“规范化”,没有标准的字符串比较函数适用于它们。
关于c# - 为 .NET 应用启用高性能 GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892815/