Qu'est-ce qui peut provoquer une réduction de la fréquence d'images lors de la mise à niveau d'une carte graphique ?

StackOverflow https://stackoverflow.com/questions/56424

  •  09-06-2019
  •  | 
  •  

Question

Nous avons une application DirectX à deux écrans qui fonctionnait auparavant à une vitesse constante de 60 FPS (taux de synchronisation des moniteurs) en utilisant un NVIDIA 8400GS (256 Mo).Cependant, lorsque nous avons remplacé la carte par une carte dotée de 512 Mo de RAM, la fréquence d'images a du mal à dépasser 40 FPS.(Cela n'atteint ce niveau élevé que parce que nous utilisons un triple tampon.) Les deux cartes proviennent du même fabricant (PNY).Toutes choses égales par ailleurs, il s'agit d'une application Windows XP Embedded et nous sommes partis d'une nouvelle image pour chaque carte.Le numéro de version du pilote est 169.21.

L'application est entièrement en 2D.C'EST À DIRE.juste un tas de quads texturés et tout un tas de graphiques pré-rendus (d'où la nécessité de mettre à niveau la mémoire de la carte).Nous avons également des animations compressées que le CPU décode à la volée – cela implique un verrouillage de texture.Les verrous prennent une éternité, mais j'ai également essayé d'avoir une texture de mémoire système distincte pour que le processeur mette à jour, puis de mettre à jour la texture rendue à l'aide de la méthode UpdateTexture de l'appareil.Aucune différence globale de performances.

Bien que j'aie lu toutes les FAQ que je peux trouver sur Internet concernant les performances de DirectX, c'est toujours la première fois que je travaille sur un projet DirectX, donc toutes les connaissances obscures que vous possédez seraient utiles.:)

Une autre chose pendant que j'y suis ;lors de l'appel de Present sur les chaînes d'échange, il semble que DirectX attend la fin du présent, même si j'utilise D3DPRESENT_DONOTWAIT dans les deux paramètres présents (PresentationInterval) et les indicateurs de l'appel lui-même.Comme il s'agit d'une application à deux écrans, cela pose un problème car les deux moniteurs ne semblent pas être verrouillés. Je contourne ce problème en exécutant les appels Present via un pool de threads.Quelle pourrait en être la cause sous-jacente ?

Était-ce utile?

La solution

Les cartes sont-elles exactement les mêmes (les deux GeForce 8400GS) et seule la taille de la mémoire diffère ?Très souvent, des tailles de mémoire différentes s'accompagnent de fréquences d'horloge légèrement différentes (c'est-à-direvotre carte avec plus de mémoire pourrait utiliser une mémoire plus lente !).

Donc, la première chose à vérifier serait les fréquences d'horloge du cœur du GPU et de la mémoire, en utilisant quelque chose comme GPU-Z.

Autres conseils

C'est un test simple pour voir si le verrouillage de la surface est le problème, il suffit de commenter la mise à jour de la texture et de voir si le framerate revient à 60 Hz.Malheureusement, écrire sur une surface verrouillée et mettre à jour la ressource tue les performances, cela a toujours été le cas.Utilisez-vous des mipmaps avec les textures ?Je sais que DX9 a ajouté la génération automatique de mipmaps, ce qui pourrait prendre beaucoup de temps pour les générer.Si vous verrouillez constamment la même ressource à chaque image, vous pouvez également essayer de créer un pool de textures, un peu comme un triple tampon, sauf avec les textures.Vous laisseriez le rendu utiliser une texture et, lors de la prochaine mise à jour, vous choisiriez la prochaine texture disponible dans le pool qui n'est pas utilisée pour le rendu.À moins bien sûr que votre mémoire soit limitée ou que vous fassiez uniquement des différences avec la texture animée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top