Включить высокопроизводительный графический процессор для a.NET приложение
Пользователи жаловались, что мое приложение (использует Direct3D 11 для рендеринга тяжелого 3D-контента для CAD-подобной функциональности)работает на Intel GPU в системах с двумя GPU.
Обнаружил, что NvOptimusEnablement
/ AmdPowerXpressRequestHighPerformance
экспортированные переменные. Тем не менее, приложение имеет интерфейс .NET, не может экспортировать вещи оттуда. Хотя есть некоторый обходной путь , этот шаг перекомпиляции нарушает отладчик (больше не может устанавливать точки останова) и делает недействительными отладочные символы, и мне нужно, чтобы они оба работали надежно.
Любое другое идеи?
Можно ли создать профиль приложения nVidia во время установки?
Или, как я могу использовать NVApi для выбора высокопроизводительного GPU?
1 ответ:
Я создал C++ DLL с пользовательским действием WIX, которое создает / обновляет профиль для приложения при установке и удаляет его при удалении.
Хотя официальный API nVidia почти не документирован, он имеет необходимые для этого функции NvAPI_DRS_*.
Вот рабочий процесс:
NvAPI_Initialize
(если не удалось, это означает, что у пользователя нет графического процессора nVidia, это не ошибка),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::поле имя_приложения, они преобразуют их в нижний регистр, а также заменить
'\'
с'/'
. Из-за этой" нормализации " для них не будет работать стандартная функция сравнения строк.