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

C# Discussion :

Fuite Mémoire - 3D


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut Fuite Mémoire - 3D
    Bonjour
    je développe en c# et j'utilise SlimDx.Direct3D9 pour la 3D
    je réalise un rendu d'une scene 3D
    jusque là tout va bien.

    mon problème est le suivant.

    j'ai besoin après le rendu de faire une image.
    donc j'utilise les Surfaces.

    le code suivant fonctionnent mais j'ai des fuites mémoires
    juste BmpX est déclarée plus haut Bitmap BmpX;

    using (surface = device.GetRenderTarget(0))
    {
    using (surface2 = Surface.CreateOffscreenPlain(device, surface.Description.Width, surface.Description.Height, surface.Description.Format, SlimDX.Direct3D9.Pool.SystemMemory))
    {
    device.GetRenderTargetData(surface, surface2);
    using (Bitmap BmpTmp = new Bitmap(Surface.ToStream(surface2, ImageFileFormat.Bmp, new Rectangle(0, 0, surface.Description.Width, surface.Description.Height))))
    {
    if (BmpX != null) { BmpX.Dispose(); BmpX = null; }
    BmpX = (Bitmap)BmpTmp.Clone();
    }
    }
    }

    sa fuis beaucoup et je vois pas pourquoi !

    quelqu'un aurai-il une solution gràce à son expérience.
    suis bloqué
    merci

    Zan

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Citation Envoyé par zan974 Voir le message
    le code suivant fonctionnent mais j'ai des fuites mémoires
    Comment le sais tu ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut Fuite
    Bonjour

    Ben quand j'enleve ce bout de code, et que je regarde dans le gestionnaire de tâche de windows, et bien je consomme une quantité de mémoire qui est stable.
    si je remets le code, sa monte continuellement.

    voilà tout.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    j'ai beau faire un dispose ou pas
    de passer par un Bitmap intermédiaire
    sa change pas grand chose
    mon idée - un bug avec la version de slilmDx v2.0.50727
    en utilisant DirectX9
    peut faut-il que je passe à Direct11
    sinon je vois pas !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    enfin je cherche encore
    d'où mes questions

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    ou alors sa viens de mon device

    je l'ais définis comme cela

    // Setup the device creation parameters
    parameters = new PresentParameters()
    {
    Windowed = true,
    BackBufferWidth = Panel3D.Width,
    BackBufferHeight = Panel3D.Height,
    BackBufferCount = 2,
    BackBufferFormat = adapterInfo.CurrentDisplayMode.Format,
    Multisample = MultisampleType.None,
    SwapEffect = SwapEffect.Discard,
    DeviceWindowHandle = Panel3D.Handle,
    PresentationInterval = PresentInterval.Default,
    FullScreenRefreshRateInHertz = 0,
    AutoDepthStencilFormat = Format.D16,
    EnableAutoDepthStencil = true
    };


    // Create the Direct3D device
    device = new Device(_direct3D9, adapterInfo.Adapter, DeviceType.Hardware, Panel3D.Handle, CreateFlags.HardwareVertexProcessing, parameters);

    device = new Device(_direct3D9, adapterInfo.Adapter, DeviceType.Hardware, Panel3D.Handle, CreateFlags.SoftwareVertexProcessing, parameters);

    _direct3DDeviceCache.Add(Panel3D.Handle, device);



    // Turn on the Z-buffer.
    device.SetRenderState(RenderState.ZEnable, true);
    device.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);

    Color4 xC = new Color4(0, 0.84f, 0.846f, 0.87f);

    device.SetRenderState(RenderState.Ambient, xC.ToArgb()); // int (Color4)




    device.SetRenderState(RenderState.StencilEnable, true);
    device.SetRenderState(RenderState.StencilFunc, (int)Compare.Always);
    device.SetRenderState(RenderState.StencilRef, 0);
    device.SetRenderState(RenderState.StencilPass, (int)StencilOperation.Replace);
    device.SetRenderState(RenderState.StencilFail, (int)StencilOperation.Replace);
    device.SetRenderState(RenderState.StencilFail, (int)StencilOperation.Replace);

    device.SetRenderState(RenderState.PointSize, 200);



    Qu'en pensez vous ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Et un Stream c'est pas IDisposable?
    En plus t'as pas de chance, en faisant comme ça, tu dois garder ouvert ton stream pendant toute la durée de vie de ton image.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    j'ai mis les surfaces dans un using(...)
    donc normalement le DIspose() est appelé à la fin du using non ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Pour la surface oui, pour le stream créé lors du ToStream non

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    C'est un début de piste qui doit être bon

    merci

    mais je sais pas comment faire autrement

    je vais chercher comment faire autrement qu'avec ToStream

    une piste ?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Je crois que sa vient du Surface.ToStream

    je m'explique

    je récupère l'image de la surface par un stream

    DataStream ds = Surface.ToStream(surface2, ImageFileFormat.Bmp, new Rectangle(0, 0, surface.Description.Width, surface.Description.Height));
    Bitmap BmpTT = new Bitmap(ds);
    ds.Close(); ds.Dispose();

    et bien y a le même problème

    par contre si cette image je la sauvegarde
    je fais un dispose du datastream et de l'image
    puis je recharche l'image
    là y a plus le problème

    j'en déduit donc que sa vient du stream

    mais la deuxième solution est bonne mais trop lente.

    je continues donc à chercher

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Vu que tes sujets sont liés, je me permet de faire une réponse agrégée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    using (surface = device.GetRenderTarget(0))
    {
      using (surface2 = Surface.CreateOffscreenPlain(device, surface.Description.Width, surface.Description.Height, surface.Description.Format, SlimDX.Direct3D9.Pool.SystemMemory))
      {
        device.GetRenderTargetData(surface, surface2);
        using (Stream tmpStream = Surface.ToStream(surface2, ImageFileFormat.Bmp, new Rectangle(0, 0, surface.Description.Width, surface.Description.Height))
        using (Bitmap BmpTmp = new Bitmap(tmpStream))
        {
          if (BmpX != null) 
          {
            BmpX.Dispose(); //liberation du vieux BmpX
            BmpX = null;
          }
          BmpX = new Bitmap(BmpTmp); //Cree vraiment une image, a partir des donnes de l'ancienne
        } //liberation de BmpTmp et tmpStream
      } //liberation de surface2
    } //liberation de surface
    Au passage, je crois que tous ce que fais ce bous de code, tu peux le faire avec graphics.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    De retour - en fait je cherche toujours la solution.
    pour le moment j'en suis là :

    using (surface = device.GetRenderTarget(0))
    {
    using (surface2 = Surface.CreateOffscreenPlain(device, surface.Description.Width, surface.Description.Height, surface.Description.Format, SlimDX.Direct3D9.Pool.SystemMemory))
    {
    device.GetRenderTargetData(surface, surface2);
    using (Stream tmpStream = Surface.ToStream(surface2, ImageFileFormat.Bmp, new Rectangle(0, 0, surface.Description.Width, surface.Description.Height)))
    {
    using (Bitmap BmpTmp = new Bitmap(tmpStream))
    {
    if (BmpX != null) BmpX.Dispose();
    BmpX = new Bitmap(BmpTmp);
    }
    }
    }
    }

    il ne faut surtout pas faire BmpX = null;
    car sa ré-affecte l'ancienne image. même après un Dispose.
    si on fait
    BmpX.Delete();
    BmpX = null;
    c'est pas bon mais je comprends pas pourquoi.

    sinon une autre solution que j'ai trouvé est de faire régulièrement un reset du device 3D. sa purge un peu.

    mais bon je continues à chercher car sa me convient pas.
    voili voilou

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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