À la fin de mon application DirectX, j'obtiens "Le périphérique Direct3D a un nombre de références différent de zéro, ce qui signifie que certains objets n'ont pas été libérés.". L'application est grande et non écrite par moi, comment puis-je déboguer quelles ressources ne sont pas libérées?DirectX 10 Resource Leak
Répondre
Vous pouvez utiliser l'utilitaire DirectX Control Panel comme décrit here. Activez la case à cocher "Break on Memory Leaks", puis vous pouvez utiliser "Break on AllocID" pour trouver quelle ressource n'a pas été libérée.
La première étape consiste à utiliser les DLL de débogage DirectX, via the DirectX Control Panel. (IIRC, il s'agit d'un élément facultatif lorsque vous installez le SDK DirectX, donc vous devrez peut-être les installer.)
Lors de la prochaine exécution de votre application, DirectX devrait vous donner plus d'informations sur les fuites. Plus précisément, vous aurez envie de chercher une ligne comme ceci:
D3DX: Set HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x1c17 to debug
allocation id ^^^^^^
Ou, comme ceci:
Direct3D9: (WARN) :Memory Address: 00385580 lAllocID=1 dwSize=000047f8, (pid=00000474)
allocation id^
Une fois que vous avez une carte d'identité d'allocation, vous pouvez dire DirectX à briser quand cette allocation se produit dans votre programme, en définissant le paramètre Break on AllocID
dans le Panneau de configuration DirectX (ou en définissant la clé de registre mentionnée ci-dessus).
Ensuite, il s'agit d'examiner le callstack pour voir quel appel DirectX est impliqué.
Est-ce que cette méthode fonctionne avec DX10? Je ne vois aucun message d'avertissement – yxk
La réponse n'est pas pertinente pour DX10, s'applique à DX9 uniquement lorsque l'utilisateur demande clairement des informations DX10. – IneQuation
Y at-il un moyen de faire fonctionner cela avec DX10? – yxk
La réponse n'est pas pertinente pour DX10, s'applique à DX9 seulement lorsque le demandeur a clairement demandé l'information DX10. – IneQuation