Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : [ VB.NET 2008 | DirectX ] Fuite de mémoire avec Direct3D ? [ Multimédia / DirectX ] (passylmat)

dimanche 13 juillet 2008 à 11:46:11 | [ VB.NET 2008 | DirectX ] Fuite de mémoire avec Direct3D ?

passylmat

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.

mardi 15 juillet 2008 à 10:44:29 | Re : [ VB.NET 2008 | DirectX ] Fuite de mémoire avec Direct3D ?

passylmat

Réponse acceptée !
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.

mardi 15 juillet 2008 à 15:48:05 | Re : [ VB.NET 2008 | DirectX ] Fuite de mémoire avec Direct3D ?

passylmat

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 !



Cette discussion est classé dans : message, programme, vb, boite, mémoire


Répondre à ce message

Sujets en rapport avec ce message

répondre en VB à une/des boîte(s) de message(s) [ par salocintehcir ] Bonjour les Amis, :-) J'utilise le solveur d'Excel dans un programme en VB, et je souhaiterais que mon programme réponde lui-même à des questions de Lotus Notes et VB [ par fred87 ] BonjourJe suis à la recherche d'infos sur le pilotage de lotus notes(boite de mail) depuis VB.J'arrive à faire certaines choses, Envoyer des messagesa VB.net / Comment modifier fichier text avec instruction VB [ par bovix ] Bonjour à tous,Je commence à m'initiner dans la programmation en VB avec VB.net, et je veux réaliser un petit programme pour mes parents qui puissent VB.UserControl [ par babchrist ] Bonjour je développe sous Windows 2000, Visual Basic 6.Depuis une semaine j'ai un problème très sérieux.Mon programme dévelppé sous Windows 2000, Visu Erreur 3709 quand je fais un recordset open. [ par laurent_diep ] Salut tout le monde,J'ai fait un petit programme en VB6 qui fait des ajouts et des modifications de bases par ADO.Les 2 seules références que j'ai ajo Poster un message a partir d'un programme en vb6 [ par culie3 ] Bonjour voila ma question:En fait ce que je voudrais faire c'est poster un message à partir d'un programme en vb6.Exemple: Dans le Text1 on marque le Un programme essaie d'envoyer un message en votre nom [ par dedebeg ] Bonjour,J'utilise une base de données pour envoyer des mails via Microsoft Outlook. Ce dernier affiche pour chaque mail un message"Un programme essaie VB - Outlook - Formulaire [ par pwautier ] Bonjour,Voilà, j'aimerais savoir comment il serait possible à partir d'un formulaire répondu et obtenu en retour sous Outlook, on arrive a modifier so équivalence StrPtr() en vb.net [ par mafiosi007 ] Bonjour, Mon programme se lance par une inputbox ou je demande un certain nombre d'informations qui serviront au bon déroulement du programme. Si l'ut VB 2005 express édition : un bogue??? [ par lulumimi ] Bonjour à tous,Enseignant l'épidémiologie et programmeur amateur depuis un certain nombre d'année (en VB 6.0), j'ai construit un programme de recueil


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Appels d'offres

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,640 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.