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

SDL Discussion :

SDL_RenderClear et fuite mémoire [SDL 2.0]


Sujet :

SDL

  1. #1
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut SDL_RenderClear et fuite mémoire
    Bonjour,

    Je débute avec la programmation sur SDL 2 (et sur SDL en général... et sur C en général).
    J'ai un problème de fuite mémoire avec la fonction SDL_RenderClear.
    Je doute que le problème viennent de la fonction elle-même, le problème doit venir de mon code et je dois passer à coté de quelque chose que je ne comprend pas.

    Voici mon code simplifié au maximum

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <SDL2/SDL.h>
     
    #include <stdio.h>
    #include <string.h>
     
    int main(int argc, char** argv)
    {
        SDL_Window* pEcran = NULL;
        SDL_Renderer* pRenderer = NULL;
        SDL_Event ev;
     
        if (SDL_Init(SDL_INIT_EVERYTHING) != 0 ) {
            fprintf(stdout,"Échec de l'initialisation de la SDL (%s)\n",SDL_GetError());
        } else {    // if (SDL_Init(SDL_INIT_EVERYTHING) != 0 )
            pEcran = SDL_CreateWindow("TEST",  SDL_WINDOWPOS_CENTERED,
                                                  SDL_WINDOWPOS_CENTERED,
                                                  800,
                                                  600,
                                                  SDL_WINDOW_SHOWN);
     
           if( pEcran == NULL ) {
                fprintf(stderr,"Erreur de création de la fenêtre: %s\n",SDL_GetError());
            } else {    // if( pEcran == NULL )
                pRenderer = SDL_CreateRenderer(pEcran,-1,SDL_RENDERER_ACCELERATED);
     
                while (1) {
                    while ( SDL_PollEvent(&ev) == 1 ) { }
                    SDL_RenderClear(pRenderer); // Sans cette ligne, pas de perte mémoire ?!?
                    SDL_RenderPresent(pRenderer);
                }   // while (1)
            }   // else if( pEcran == NULL )
        }   // else (SDL_Init(SDL_INIT_EVERYTHING) != 0 )
     
        SDL_DestroyRenderer(pRenderer);
        SDL_DestroyWindow(pEcran);
        SDL_Quit();
     
        return 0;
    }
    Si j'enlève la ligne SDL_RenderClear, je n'ai pas de problème de fuite mémoire, avec ça fuit.

    Je ne sais pas quelles informations pourrait vous être utile pour m'aider alors en voici quelques une en vrac :
    - j'utilise code blocks 13.12
    - La version de SDL est 2.0.3
    - J'utilise la version 32bits

    Si une âme charitable pouvait m'indiquer mon (mes ?) erreur(s), je lui en serais très reconnaissant.
    Merci.

  2. #2
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Ah ben en fait, il semblerait qu'il n'y ait pas de problème.
    J'ai laissé tourné mon programme pendant 1/2 heure et après avoir étrangement pris 6Mo de mémoire en plus durant les premières minutes, il s'est stabilisé.

    Le programme que j'ai lancé est un peu plus complexe que celui proposé. Grosso modo il affiche un menu et le nombre de frames par secondes.
    L'affichage est instantané et il affiche environ 600 frames par secondes (donc toujours les mêmes au détail près du nombre de fps).

    Je ne comprends pas pourquoi il a besoin de ces 6Mo supplémentaire au fil du temps mais comme il s'arrête de consommer plus de mémoire, ça ne me gène pas.

    Désolé de vous avoir fait perdre votre temps.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J'imagine que vous utilisez le gestionnaire des taches pour le suivi de la mémoire. Ce n'est pas du tout précis, ni la bonne méthode. Il faut que vous utilisez valgrind (Linux) ou Dr Memory, qui sont des outils spécialisés pour valider/vérifier/observer/analyser les accès mémoires et ainsi détecter les fuites ou non de mémoire.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    L'idée que l'on puisse utiliser autre chose que le gestionnaire des tâches ne m'a même pas effleuré l'esprit.

    J'ai donc installé DrMemory. Mais mes programmes lancés à travers l'outil plantent systématiquement.
    J'ai fait un essai avec calc.exe (l'exemple donné sur le site DrMemory) et là, ça fonctionne. Le problème vient donc de ma façon de compiler ou quelques chose comme cela.

    Je n'ai pas encore étudié attentivement la documentation, j'ai juste fait une première lecture (c'est-à-dire, aller directement aux exemples). J'étudierai cela plus en détail lorsque j'aurais un peu de temps (et l'envie).

    Merci beaucoup pour l'info.

  5. #5
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    J'ai réussi à faire fonctionner DrMemory avec mon programme !
    Merci.

    Pour info, lorsque j'utilise le paramètre SDL_RENDERER_ACCELERATED pour la fonction SDL_CreateRenderer, mon programme plante.
    Si j'utilise SDL_RENDERER_SOFTWARE, je peux utiliser mon programme.

    Pour résumer, ce empêche l'utilisation de DrMemory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_p_Renderer = SDL_CreateRenderer(m_p_Ecran,-1,SDL_RENDERER_ACCELERATED);
    Mais si je la remplace par ceci, je peux utiliser DrMemory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_p_Renderer = SDL_CreateRenderer(m_p_Ecran,-1,SDL_RENDERER_SOFTWARE);
    C'est dommage, je pers environ 300fps (passant de 600 à300 pour le menu et de 400 à 100 pour le jeu en lui-même).

    J'ai pu boucher mes fuites mémoires (oui, il y en avait).

    Il me reste quelques erreurs :
    10 unique unaddressable access(es)
    => 8 de ces erreurs correspondent juste des appels au DLL windows ou au DLL SDL, mon code n'est même pas cités. Je me dis donc que ce n'est rien de grave.
    => 1 correspondant au TTF_OpenFont utilisé pour afficher les fps (alors que mes autres appels à cette fonction ne posent pas de problème)
    6 unique uninitialized access(es)
    => 2 de ces erreurs correspondent juste des appels au DLL windows ou au DLL SDL, mon code n'est même pas cités. Je me dis donc que ce n'est rien de grave.
    => 3 de ces erreurs correspondent aux lignes de code suivantes (oui, j'ai plusieurs fois des boucle PollEvent, une par "écran").
    Que la variable EvSDL n'est pas initialisée, je le confirme, c'est le rôle de SDL_PollEvent de me l'initialiser / mettre à jour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( SDL_PollEvent(&EvSDL) )
    => 1 erreur sur un std::min alors que pour moi tout est initialisé.
    1 unique GDI usage error(s)
    => Correspond à la ligne de code suivante (j'ai rapidement lu que ce genre d'erreurs pouvait ne pas en être donc je ne m'inquiète pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_p_Renderer = SDL_CreateRenderer(m_p_Ecran,-1,SDL_RENDERER_SOFTWARE);
    Donc je considère qu'au vu de ces résultats mon programme n'a plus de problème si ce n'est mon TTF_OpenFont mais je regarderait cela plus tard et le problème sur mon std::min.

    Je publierait mon code lorsque mon programme sera terminé (c'est un Tetris, je voulais être original).

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    L'erreur avec SDL_PollEvent(), je l'ai aussi vu sur valgrind et je ne la comprend pas.
    Je vous conseille d'aller plus loin encore sur le SDL_OpenFont().
    Mais sinon, c'est bien que vous ayez retiré les autres erreurs
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Je vous conseille d'aller plus loin encore sur le SDL_OpenFont().
    Après des recherches et des essais, il s'avère que le problème provient de la police que j'utilise (http://www.dafont.com/fr/expressway.font).

    Avec le même exécutable, si je renomme mon fichier ttf pour utiliser une autre police, il n'y a plus de souci.
    J'ai rajouté un écran de crédits où j'utilise cette police et j'y ai le même problème (qui ce résout de la même façon).

    Je suis déçu, je la trouvais très bien et j'ai eu du mal à la choisir.

    Edit : J'ai essayé d'autres police trouver sur Datfont.com et plusieurs me pose le même problème (mais j'en ai finalement trouvé une qui ne me pose pas problème et qui me convient).

  8. #8
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Pour terminer cette discussion, le code source du projet est disponible ici :

    http://jeux.developpez.com/telecharg...208/Tetris-SDL

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

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