2012-05-10 9 views
23

Estoy programando un juego DirectX, y cuando lo ejecuto en una computadora portátil Optimus se usa la GPU Intel, lo que resulta en un rendimiento horrible. Si fuerzo la GPU de NVIDIA usando el menú contextual o cambiando el nombre de mi ejecutable a bf3.exe o algún otro nombre ejecutable de juego famoso, el rendimiento es el esperado.
Obviamente, tampoco es una solución aceptable para cuando tengo que redistribuir mi juego, entonces ¿hay alguna manera de obligar programáticamente a la computadora portátil a utilizar la GPU NVIDIA?

Ya he intentado usar DirectX para enumerar adaptadores (IDirect3D9 :: GetAdapterCount, IDirect3D9 :: GetAdapterIdentifier) ​​y no funciona: solo se informa 1 GPU (el que está en uso).Forzar la GPU de NVIDIA mediante programación en las computadoras portátiles Optimus

Respuesta

4

El documento técnico de Optimus en http://www.nvidia.com/object/LO_optimus_whitepapers.html no está claro exactamente qué se necesita antes de realizar un cambio a la 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 para intentar sería hacer una llamada CUDA, por ejemplo al cuInit(0);. A diferencia de DX y DXVA, no hay forma de que los gráficos integrados de Intel manejen eso, por lo que debe forzar un cambio a la GPU.

+0

¿Alguien tuvo éxito real con este método? Intenté llamar a 'cuInit' antes de crear mi contexto OpenGL, y obtuve un contexto Intel no uno de NVidia. – rotoglup

+0

@rotoglup: Indíquenos qué SO está ejecutando y, si encuentra una solución, agréguela como respuesta a esta pregunta. –

+0

Estoy ejecutando los controladores Win7 home x64 SP1 + NVidia 296.16. No tengo ni idea de cómo proceder: la [Guía del desarrollador NVIDIA CUDA para plataformas NVIDIA Optimus] (http://developer.download.nvidia.com/compute/cuda/docs/CUDA_Developer_Guide_for_Optimus_Platforms.pdf) doc menciona que vincular un OpenGL contexto para CUDA no funciona en las plataformas Optimus, dice que esto requiere un "perfil de aplicación" en el Panel de control de NVidia ... Tal vez NVAPI permite crear dicho perfil de manera programática, pero el sitio web de desarrolladores de NVidia está caído. – rotoglup

32

Según http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf empezando desde 302 conductores es suficiente para enlazar estáticamente con una de las siguientes bibliotecas: vcamp110.dll, vcamp110d.dll, nvapi.dll, nvapi64.dll, OpenCL . .dll, nvcuda.dll, cudart * *, o exportar una variable NvOptimusEnablement en su programa:

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

+1 para la variable de habilitación (y el enlace correspondiente); Nota: No funcionó para mi 310-driver, pero funcionó después de la actualización a 320 – NobodysNightmare

+1

Debe tenerse en cuenta que la configuración del procesador de gráficos preferido en el panel de control NVIDIA debe configurarse en "Auto-select" para que esto funcione. – Nathan

+0

Esto ya no funciona (GTX 960M - driver v385.41) – Matthias

Cuestiones relacionadas