[ VB.NET 2008 | DirectX ] Fuite de mémoire avec Direct3D ?

Résolu
passylmat Messages postés 17 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 29 décembre 2008 - 13 juil. 2008 à 11:46
passylmat Messages postés 17 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 29 décembre 2008 - 28 févr. 2009 à 09:31
Bonjour à tous.

Après une dizaine d'années à programmer en VB 6.0, j'ai décidé de me mettre à VB.NET. Ainsi, après quelques programmes concluant, j'ai décidé de franchir le cap DirectX. Je me suis donc créé un début de jeu en 2D avec l'utilisation de Direct3D du style Castlevania ou Metroid sur GBA. Je suis assez content du fonctionnement de mon jeu mais je me suis rendu compte il y a peu que lorsque je laissait le jeu tourner, meme sans rien faire, son utilisation de la mémoire augmentait inexorablement, ce qui entrainait une forte diminution du FPS. Je pense donc que l'augmentation de son utilisation en mémoire est due à une fuite de mémoire. J'ai pourtant vérifier mon programme, il me semble avoir correctement libéré la mémoire de mes variables et je ne comprend vraiment pas pourquoi j'ai ce problème.

J'ai également remarqué que lorsque j'affichais une boite de message(mon programme a 3 "types de fonctionnement" : lorsque l'on controle le personnage, lorsqu'une boite de message créée main est affichée et lorsque le menu principal est affiché), le FPS diminuait fortement avant de remonter lorsque la boite de message n'était plus affichée. J'ai d'ébord cru au départ que c'était à cause du fait que la boite de message était gérer par une classe, j'ai donc supprimé lé classe et rajouté des fonctions/sub dans mon programme pour la gérer, mais le résultat semble etre le meme.

J'ai essayer de rechercher des problèmes similaires sur internet et sur VBFrance, mais ne sachant comment poser ma question, les résultats n'ont pas été fructueux.

Ne sachant que faire, j'aimerais avoir votre avis sur mon programme dont vous trouverez le code ici.

Merci d'avance de votre aide.
Cordialement.
Passylmat.

PS: n'essayer pas de comprendre les codes pour charger/enregistrer un fichier, il ne sont pas tous finit et pas vraiment au point et j'ai dû les mettre en suspend face à mon problème de mémoire.

4 réponses

passylmat Messages postés 17 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 29 décembre 2008
15 juil. 2008 à 10:44
Rebonjour à tous !

Après 2 jours d'intenses réflexions et de test divers et variés sur mon programme, j'ai réussit à isoler le problème dans la partie affichage, puis, là encore après de multiple test, je me suis rendu compte que le problème venait de ma procédure d'affichage de texte. En effet, lorsque je mettait toute ma sub en commentaire et que je laissait le code:

Public Sub Afficher()

Device.BeginScene()
AfficherTexte(String.Format("FPS : {0}", FPS), New Point(0,0),MFrm.Font, Color.Black)
Device.EndScene()
Device.Present()

End Sub
Mon problème persistait. J'ai donc rétablit tout l'affichage puis j'ai enlevé la ligne AfficherTexte et là, par miracle, je n'avais mon problème de mémoire. Après quelques minutes de réflexions, j'ai quelque peu condensé mon code et j'ai surtout remplacé DrawTexte = Nothing par DrawTexte.Dispose() et là ça marche nickel! Voici donc mes nouvelles subs AfficherTexte:

Public Sub AfficherTexte(ByVal Texte As String, ByVal Pos As Point, ByVal Police As System.Drawing.Font, ByVal Couleur As System.Drawing.Color, Optional ByVal Centrer As Boolean = False)

        Dim DrawTexte As Font = New Font(Device, Police)

        If Centrer = True Then
            'Dim p As System.Drawing.Font = MFrm.Font

            'MFrm.Font = Police
            Dim g As Graphics = MFrm.CreateGraphics
            Dim Taille As SizeF = g.MeasureString(Texte, Police) 'récupère la taille
            Dim tmpPos As Point = New Point(CInt(Pos.X - (Taille.Width / 2)), CInt(Pos.Y - (Taille.Height / 2)))
            Pos = tmpPos

            'MFrm.Font = p
            'p.Dispose()
            g.Dispose()
            Taille = Nothing
            tmpPos = Nothing
        End If

        Sprite.Begin(SpriteFlags.AlphaBlend)
        DrawTexte.DrawText(Sprite, Texte, Pos, Couleur)
        Sprite.End()

        DrawTexte.Dispose()

    End Sub
Public Sub AfficherTexte(ByVal Texte As String, ByVal Pos As Point, ByVal Police As System.Drawing.Font, ByVal Couleur As System.Drawing.Color, ByVal CouleurContour As System.Drawing.Color, Optional ByVal Centrer As Boolean = False)

        Dim DrawTexte As Font = New Font(Device, Police)

        If Centrer = True Then
            'Dim p As System.Drawing.Font = MFrm.Font

            'MFrm.Font = Police
            Dim g As Graphics = MFrm.CreateGraphics
            Dim Taille As SizeF = g.MeasureString(Texte, Police) 'récupère la taille
            Dim tmpPos As Point = New Point(CInt(Pos.X - (Taille.Width / 2)), CInt(Pos.Y - (Taille.Height / 2)))
            Pos = tmpPos

            'MFrm.Font = p
            'p.Dispose()
            g.Dispose()
            Taille = Nothing
            tmpPos = Nothing
        End If

        Sprite.Begin(SpriteFlags.AlphaBlend)
        For i As Integer = -1 To 1
            For j As Integer = -1 To 1
                DrawTexte.DrawText(Sprite, Texte, Pos.X + i, Pos.Y + j, CouleurContour)
            Next
        Next
        DrawTexte.DrawText(Sprite, Texte, Pos.X, Pos.Y, Couleur)
        Sprite.End()

        DrawTexte.Dispose()

    End Sub

Je vais maintenant refaire ma classe MsgBx et je vous reposterait tout mon code!
Merci à tout ceux qui ont cherché.
Cordialement, Passylmat.
3
passylmat Messages postés 17 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 29 décembre 2008
15 juil. 2008 à 15:48
Voici mon projet mis au point et sans erreurs de programmations, apparament. J'ai rajouté le code pour charger des fichiers de sauvegarde. Merci encore à tous et bonne programmation !!

lien

Cordialement, Passylmat

PS: n'hésitez pas à signaler un lien mort par PM, même si je pense pas pouvoir vous aider dans 2 ans !
0
whitelegend Messages postés 156 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 2 mars 2009
23 févr. 2009 à 17:24
Salut,

Lien mort

LC

__________________________________________________________________________
Pensez à accepter les réponses qui vous servent  
0
passylmat Messages postés 17 Date d'inscription mercredi 11 janvier 2006 Statut Membre Dernière intervention 29 décembre 2008
28 févr. 2009 à 09:31
J'ai reuploadé le projet, voici le nouveu lien

Cordialement, Passylmat
0
Rejoignez-nous