2016-11-30 2 views
3

Les utilisateurs se sont plaints que mon application (utilise Direct3D 11 pour restituer du contenu 3D lourd pour une fonctionnalité de type CAO) s'exécute sur un GPU Intel sur un système à deux processeurs graphiques.Activer le GPU hautes performances pour une application .NET

Trouvé NvOptimusEnablement/AmdPowerXpressRequestHighPerformance variables exportées. Cependant, l'application a .NET frontend, ne peut pas exporter des choses à partir de là. Alors que there’s some workaround, cette étape de recompilation casse le débogueur (ne peut plus définir de points d'arrêt) et invalide les symboles de débogage, et j'ai besoin que les deux fonctionnent correctement.

D'autres idées?

Est-il possible de créer un profil d'application nVidia lors de l'installation?

Ou, comment utiliser NVApi pour sélectionner le GPU hautes performances?

Répondre

2

J'ai créé une DLL C++ avec une action WIX personnalisée, qui crée/met à jour le profil de l'application lors de l'installation et la supprime lorsqu'elle est désinstallée.

Bien que presque non documenté, l'API nVidia officielle possède les fonctions NvAPI_DRS_ * requises pour cela.

Voici un flux de travail: NvAPI_Initialize (en cas d'échec, cela signifie que l'utilisateur n'a pas nVidia GPU, ce n'est pas une erreur), NvAPI_DRS_CreateSession, NvAPI_DRS_LoadSettings, NvAPI_DRS_FindProfileByName.

Si n'a pas été trouvé, NvAPI_DRS_CreateProfile et trois appels à NvAPI_DRS_SetSetting, établissant trois propriétés 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

Ensuite, , appelez NvAPI_DRS_GetProfileInfo à g et nombre d'applications, suivi de NvAPI_DRS_EnumApplications, et recherche le chemin EXE. Lorsque je désinstalle, je supprime le profil complet en appelant le NvAPI_DRS_FindProfileByName puis NvAPI_DRS_DeleteProfile.

Lors de la réinstallation et la mise à niveau, je fais les deux, d'abord supprimer puis ajouter.

Ne pas oublier NvAPI_DRS_SaveSettings à la fin.

P.S. La chose la plus inattendue est que nVidia «normalise» les chemins stockés dans le champ NVDRS_APPLICATION :: appName, les convertit en minuscules et remplace également '\' par '/'. En raison de cette "normalisation", aucune fonction de comparaison de chaîne standard ne fonctionnera pour eux.