Включить высокопроизводительный графический процессор для a.NET приложение


Пользователи жаловались, что мое приложение (использует Direct3D 11 для рендеринга тяжелого 3D-контента для CAD-подобной функциональности)работает на Intel GPU в системах с двумя GPU.

Обнаружил, что NvOptimusEnablement / AmdPowerXpressRequestHighPerformance экспортированные переменные. Тем не менее, приложение имеет интерфейс .NET, не может экспортировать вещи оттуда. Хотя есть некоторый обходной путь , этот шаг перекомпиляции нарушает отладчик (больше не может устанавливать точки останова) и делает недействительными отладочные символы, и мне нужно, чтобы они оба работали надежно.

Любое другое идеи?

Можно ли создать профиль приложения nVidia во время установки?

Или, как я могу использовать NVApi для выбора высокопроизводительного GPU?

1 3

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 свойства:

  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::поле имя_приложения, они преобразуют их в нижний регистр, а также заменить '\' с '/'. Из-за этой" нормализации " для них не будет работать стандартная функция сравнения строк.