IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Perte de mémoire


Sujet :

DirectX

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private void Rendu()
    {
        Render.BeginDraw();
     
        Render.EndDraw();
    swapChain.Present(1, PresentFlags.None); 
    }
    Bonjour,
    J'utilise SharpDX (qui utilise DirectX) et j'ai codé le rendu d'un panel en C# comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void Rendu()
    {
        Render.BeginDraw();
        Graphic.Clear(ColeurBackGround);
        for (int i=0;i<10;i++)
           for (int j=0;j<1000;j++)
            Graphic.DrawLine(new Vector2(Form.Data.Profil[i].Segment[j].X0, Form.Data.Profil[i].Segment[j].Y0), new Vector2(Form.Data.Profil[i].Segment[j].X1, Form.Data.Profil[i].Segment[j].Y1), new SolidColorBrush(Graphic, Form.Data.Profil[i].Couleur), 1f, new StrokeStyle(factory, strokeProperties));
        Render.EndDraw();
        swapChain.Present(0, PresentFlags.None); 
    }
    La méthode Rendu() est utilisé ici dans une boucle de message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Boucle de message
                    Form1 Form = new Form1();
                    Form.Show();
                    while (Form.Created)
                    {
                        if (Form.vue2D!=null)
                            Form.vue2D.Render();
                        Application.DoEvents();
                    }
                    Form.Dispose();
    Au début, l'affichage se fait, mais j'ai une perte progressive de mémoire (leak memory) avec un message d'erreur sur DrawLine: out of memory!

    Je ne comprend pas pourquoi j'obtiens ce plantage, quelqu'un aurait-il une idée? Merci

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 359
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 359
    Points : 20 374
    Points
    20 374
    Par défaut
    bonjour

    Essayer d'effacer avec Dispose() chaque SolidColorBrush crée par un new si possible
    J'ai eu un problème similaire en C++ avec le GDI

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    J'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     {SolidColorBrush Brus=new SolidColorBrush(Graphic, Form.Data.Profil[i].Couleur);
                        Graphic.DrawLine(new Vector2(Form.Data.Profil[i].Segment[j].X0, HauteurVue - Form.Data.Profil[i].Segment[j].Y0), new Vector2(Form.Data.Profil[i].Segment[j].X1, HauteurVue - Form.Data.Profil[i].Segment[j].Y1), Brus, EpaisseurProfil / Pages[PageSelectionnee].ValeurZoom, new StrokeStyle(factory, strokeProperties));
                        Brus.Dispose();
    }
    dans les boucles for, mais toujours une fuite de mémoire...

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    Ca y est, c'est résolu, plus de fuite mémoire.
    Il fallait faire Dispose pour la Brush et le Stroke.
    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {
     SolidColorBrush _Brush=new SolidColorBrush(Graphic, Form.Data.Profil[i].Couleur);
                        StrokeStyle _Stroke = new StrokeStyle(factory, strokeProperties);
                        Graphic.DrawLine(new Vector2(Form.Data.Profil[i].Segment[j].X0, HauteurVue - Form.Data.Profil[i].Segment[j].Y0), new Vector2(Form.Data.Profil[i].Segment[j].X1, HauteurVue - Form.Data.Profil[i].Segment[j].Y1), _Brush, EpaisseurProfil / Pages[PageSelectionnee].ValeurZoom, _Stroke);
                        _Stroke.Dispose();
                        _Brush.Dispose();
    }
    Toutefois, je ne comprend toujours pourquoi ces 2 objets ne sont détruit automatiquement, puisque cela devrait être fait par le Garbage collector (c'est du C#) après être sorti de la procédure de Render().

    Merci encore pour votre réponse.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par Helices Voir le message
    Toutefois, je ne comprend toujours pourquoi ces 2 objets ne sont détruit automatiquement, puisque cela devrait être fait par le Garbage collector (c'est du C#) après être sorti de la procédure de Render().
    Et bien, tes objets sont bien détruits, par contre ils utilisent probablement des ressources qui elles ne sont pas managées, c'est-à-dire qui sont ignorées par le garbage collector. Ce sont des ressources qu'il faut libérer explicitement sous peine de leaks. C'est pour ça qu'on utilise le mécanisme de IDisposable : on appelle la méthode Dispose() pour indiquer qu'il faut libérer maintenant les ressources non managées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme perte de mémoire - Chilkat
    Par Olphébus dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2008, 01h16
  2. Regex et perte de mémoire
    Par OrthoMaker dans le forum C
    Réponses: 10
    Dernier message: 11/09/2007, 12h43
  3. Réponses: 11
    Dernier message: 16/07/2007, 16h33
  4. Perte de mémoire - je ne comprend pas.
    Par pilouface dans le forum C
    Réponses: 12
    Dernier message: 08/02/2007, 16h39
  5. Pertes de mémoire avec Rave
    Par stepschn dans le forum Delphi
    Réponses: 8
    Dernier message: 15/10/2006, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo