passylmat
Messages postés17Date d'inscriptionmercredi 11 janvier 2006StatutMembreDernière intervention29 décembre 2008
-
13 juil. 2008 à 11:46
passylmat
Messages postés17Date d'inscriptionmercredi 11 janvier 2006StatutMembreDernière intervention29 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.
A voir également:
[ VB.NET 2008 | DirectX ] Fuite de mémoire avec Direct3D ?
passylmat
Messages postés17Date d'inscriptionmercredi 11 janvier 2006StatutMembreDernière intervention29 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
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.
passylmat
Messages postés17Date d'inscriptionmercredi 11 janvier 2006StatutMembreDernière intervention29 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 !!