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 :

probleme memoire sdl


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Par défaut probleme memoire sdl
    Bonjour ,
    j'utilise SDL et une surface
    je charge une image dans une surface je la bilt sur mon ecran et je la desaloue et la au surprise je m'appercoit que ma memoire augmente

    j'avoue ne pas comprendre

    voici le code que j'utilise pourle blit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void ChargeImage(const char *Chemin,BufferTravail NomBuffer)
    {//charge une image sur le buffer selectionné
        SDL_Surface *Copie=NULL;
        SDL_Rect PosCopie;
     
        if (Buffer[NomBuffer]!=NULL)
        {
            Copie=SDL_DisplayFormat(SDL_LoadBMP(Chemin));
            SetRect(&PosCopie,0,0,Buffer[NomBuffer]->w,Buffer[NomBuffer]->h);
            SDL_BlitSurface(Copie, &PosCopie, Buffer[NomBuffer], &PosCopie); //Copie sur la surface
            SDL_FreeSurface(Copie);
        }
    }
    Buffer[NomBuffer] est une table de buffer que j'utilise pour mes besoins
    si j'en ai pas besoin il sont vide(pas d'allocation et NULL)

    l'ecran est le buffer[0] c'est le seul alloué au depart par la creation de fenetre

    pouvez vous m'aider????

    merci

  2. #2
    Membre éprouvé Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Par défaut
    Pour moi, le problème ce situe là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Copie=SDL_DisplayFormat(SDL_LoadBMP(Chemin));
    La fonction SDL_LoadBMP alloue de l'espace mémoire, tout comme la fonction SDL_DisplayFormat. Donc tu effectues deux allocations et une désallocation.

    Pour régler le problème :
    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
     
    void ChargeImage(const char *Chemin,BufferTravail NomBuffer)
    {//charge une image sur le buffer selectionné
        SDL_Surface *Copie=NULL;
        SDL_Rect PosCopie;
     
        if (Buffer[NomBuffer]!=NULL)
        {
            SDL_Surface *bmp = SDL_LoadBMP(Chemin);
            Copie=SDL_DisplayFormat(bmp);
            SetRect(&PosCopie,0,0,Buffer[NomBuffer]->w,Buffer[NomBuffer]->h);
            SDL_BlitSurface(Copie, &PosCopie, Buffer[NomBuffer], &PosCopie); //Copie sur la surface
            SDL_FreeSurface(Copie);
            SDL_FreeSurface(bmp);
        }
    }
    Mais ce code est loin d'être performant, il n'est pas bon de faire des allocations et désallocations à chaque blitage. Habituellement, en début de jeu/niveau, on charge les images dont on aura besoin, puis, le temps que dure la partie on les blitte, et enfin on les désalloue lors du game over. (en imaginant que tu fais un jeu)

    Et puis, comme le dit le nom de ta fonction, ChargeImage est censé charger l'image et non l'afficher.

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Ensuite, ce code est compliqué pour pas grand chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SetRect(&PosCopie,0,0,Buffer[NomBuffer]->w,Buffer[NomBuffer]->h);
    SDL_BlitSurface(Copie, &PosCopie, Buffer[NomBuffer], &PosCopie);
    En effet, pour ta destination, le système ne va que regarder la position x et y qui est pour toi à 0. Du coup, tu peux mettre NULL.

    Ensuite, si ta largeur et longueur c'est la taille du buffer destination alors ce n'est pas la peine de mettre quelque chose comme rectangle source, tu peux mettre NULL.

    Du coup, ton appel SetRect ne sert pas à grand chose et ton code devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_BlitSurface(Copie, NULL, Buffer[NomBuffer], NULL);
    Jc

Discussions similaires

  1. [JVM] Problème mémoire
    Par javaDev dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2006, 11h40
  2. Probleme affichage SDL surface
    Par masterfrog dans le forum SDL
    Réponses: 4
    Dernier message: 27/11/2005, 17h25
  3. Installation Wesnoth problème configure/SDL
    Par Niktou dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 18/11/2005, 19h32
  4. [ASE]probleme memoire: select dans une insert
    Par SegmentationFault dans le forum Sybase
    Réponses: 2
    Dernier message: 16/08/2005, 12h20
  5. Eclipse UML, JVM - Problème mémoire - Mandrake ?
    Par chat hotplug dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 02/08/2005, 14h05

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