2016-11-30 161 views
3

用戶抱怨我的應用程序(使用Direct3D 11渲染某些類似於CAD的功能的重度3D內容)在雙GPU系統上的Intel GPU上運行。爲.NET應用程序啓用高性能GPU

發現NvOptimusEnablement/AmdPowerXpressRequestHighPerformance導出變量。但是,該應用程序有.NET前端,不能從那裏導出東西。雖然there’s some workaround,該重新編譯步驟打破了調試器(不能設置斷點),並使調試符號無效,我需要它們都可靠地工作。

還有其他想法嗎?

安裝時是否可以創建nVidia應用程序配置文件?

或者,如何使用NVApi選擇高性能GPU?

回答

2

我製作了一個C++ DLL自定義WIX動作,在安裝時爲應用程序創建/更新配置文件,並在卸載時將其刪除。

雖然幾乎沒有文檔,官方nVidia API具有所需的NvAPI_DRS_ *函數。

這裏有一個工作流程:NvAPI_Initialize(如果失敗,則意味着用戶沒有nVidia的GPU,這是不是一個錯誤),NvAPI_DRS_CreateSessionNvAPI_DRS_LoadSettingsNvAPI_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最後。

P.S.最讓人意想不到的是,nVidia將存儲在NVDRS_APPLICATION :: appName字段中的路徑「歸一化」,並將它們轉換爲小寫字母,並將'\'替換爲'/'。由於這種「規範化」,沒有標準字符串比較函數適用於它們。