c++ - rtx - nvidia installer
Forzando NVIDIA GPU programáticamente en computadoras portátiles Optimus (2)
Estoy programando un juego DirectX, y cuando lo ejecuto en una computadora portátil Optimus, se utiliza la GPU Intel, lo que resulta en un rendimiento horrible. Si fuerzo a la GPU NVIDIA usando el menú contextual o cambiando el nombre de mi ejecutable a bf3.exe o algún otro nombre famoso ejecutable del juego, el rendimiento es el esperado.
Obviamente, tampoco es una solución aceptable para cuando tengo que redistribuir mi juego, ¿así que hay una manera de forzar a la computadora portátil para que use la GPU NVIDIA?
Ya he intentado usar DirectX para enumerar adaptadores (IDirect3D9 :: GetAdapterCount, IDirect3D9 :: GetAdapterIdentifier) y no funciona: solo se informa 1 GPU (la que está en uso).
De acuerdo con http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf partir de 302 controladores, es suficiente para vincular estáticamente con una de las siguientes bibliotecas: vcamp110.dll , vcamp110d.dll , nvapi.dll , nvapi64.dll , opencl.dll , nvcuda.dll , cudart *. * , o para exportar una variable NvOptimusEnablement en su programa:
extern "C" {
_declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
}
El documento técnico de Optimus en http://www.nvidia.com/object/LO_optimus_whitepapers.html no tiene claro exactamente lo que se necesita antes de realizar un cambio a GPU. El documento técnico dice que las llamadas DX, DXVA y CUDA se detectan y harán que se encienda la GPU. Pero además, la decisión se basa en los perfiles mantenidos por NVIDIA y, por supuesto, todavía no existe uno para su juego.
Una cosa a intentar sería hacer una llamada CUDA, por ejemplo a cuInit(0);
. A diferencia de DX y DXVA, no hay forma de que los gráficos integrados de Intel manejen eso, por lo que debería forzar un cambio a la GPU.