Заставляя видеокарта NVIDIA программно на Оптимус ноутбуков


Я программирую игру DirectX, и когда я запускаю ее на ноутбуке Optimus, используется графический процессор Intel, что приводит к ужасной производительности. Если я заставлю графический процессор NVIDIA использовать контекстное меню или переименовать мой исполняемый файл в bf3.exe или какое-то другое известное имя исполняемого файла игры, производительность, как и ожидалось.
Очевидно, что ни то, ни другое не является приемлемым решением для того, когда я должен распространять свою игру, так есть ли способ программно заставить ноутбук использовать графический процессор NVIDIA?

Я уже пробовал. использование DirectX для перечисления адаптеров (IDirect3D9:: GetAdapterCount, IDirect3D9:: GetAdapterIdentifier), и это не работает: сообщается только о 1 GPU (тот, который используется).

2 23

2 ответа:

The Optimus whitepaper at http://www.nvidia.com/object/LO_optimus_whitepapers.html неясно, что именно требуется для перехода на GPU. В белой бумаге говорится, что вызовы DX, DXVA и CUDA обнаружены и вызовут включение графического процессора. Но кроме того, решение основано на профилях, поддерживаемых NVIDIA, и, конечно же, еще не существует для вашей игры.

Одна вещь, чтобы попытаться сделать вызов CUDA, например, cuInit(0);. В отличие от DX и DXVA, нет способа для интегрированной графики Intel справиться с этим, поэтому он должен принудительно переключиться на GPU.

Согласно http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf начиная с 302 драйверов, достаточно статически связать их с одной из следующих библиотек: vcamp110.ДЛЛ, vcamp110d.dll, nvapi.dll, nvapi64.dll, opencl.ДЛЛ, nvcuda.dll, кадарт*.*, или экспортировать переменную NvOptimusEnablement в вашу программу:

extern "C" {
    _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
}