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 :

petite question memoire (en SDL)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut petite question memoire (en SDL)
    bonsoir

    voilà j'ai besoin de votre conseil :
    voilà mon petit code :

    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
    SDL_Surface*ecran;
    SDL_Rect positon;
     
    SDL_Init(SDL_INIT_VIDEO);
    ecran=SDL_SetVideoMode(100 , 100 , 32 , SDL_HWSURFACE);
     
    position.x=0;position.y=0;
    SDL_BlitSurface(SDL_LoadBMP("n'importe laquelle") , NULL , ecran , &position);
    SDL_Flip(ecran);
     
    //............patati patata.................
     
    //la fin 
     
    SDL_Quit();
    on a là deux surfaces ecran (globale) et l'autre qu'on collée,
    je ne sais pas comment libérer de l'espace alloué à ecran et à l'autre.
    je pense que SDL_Quit(); libére ecran, n'est ce pas ??

    qu'en dites vous ??

    merci d'avance!

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Pour désallouer la mémoire allouer par la SDL, il faut utiliser la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_FreeSurface(SDL_Surface*)
    Pour votre code, avant le SDL_Quit il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_FreeSurface(ecran);
    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.

  3. #3
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut
    oui mais la surface qu'on a collé sur ecran !!
    on en fait quoi ??

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Ah oui, excusez moi j'avais pas vu ce petit détail dans le code
    Donc de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_BlitSurface(SDL_LoadBMP("n'importe laquelle") , NULL , ecran , &position);
    tu passe à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SDL_Surface* image = SDL_LoadBMP("votre_image.bmp");
    if ( image == NULL )
    <div style="margin-left:40px">//erreur
    SDL_FreeSrface(ecran); // On supprime ce qui avait été crée
    return; // Si possible en notifiant l'erreur</div>
    SDL_BlitSurface(image , NULL , ecran , &position);
     
    // Avant le SDL_Quit
    SDL_FreeSurface(image);
    SDL_FreeSurface(ecran);
    Je voudrais juste remarquer que le code de base était très "instable" car si SDL_LoadBMP n'arrive pas à charger elle retourne nulle, et peut donc faire planté SDL_BlitSurface... ( enfin ça dépend comment c'est géré par la SDL après , j'ai pas vérifié la doc ).
    ( Mais comme vous l'avez dit, on perdait bien la 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.

  5. #5
    Membre confirmé Avatar de fred_sell
    Inscrit en
    Juin 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 106
    Par défaut
    ce que j'ai compris c'est qu'on doit affecter l'image BMP chargée dans un pointeur qu'on connait puis quand on veut libérer la mémoire on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SDL_FreeSurface(notre pointeur); //puis...
    SDL_FreeSurface(la surface globale);
    n'est ce pas ??

    d'habitude dans SDL_BlitSurface, j'envoie directement l'image chargée par
    SDL_LoadBMP dans le 1er paramètre sans la stocker d'abord dans
    un pointeur.
    comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(SDL_LoadBMP("n'importe laquelle") , NULL , ecran , &position);
    est ce que tout ce que j'ai dit est vrai ?

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Tout est bon dans ce que vous avez dit,

    Bien sur que ça marche de passer directement le resultat de SDL_LoadBMP dans SDL_Blit, sauf que le jour ou SDL_LoadBMP plante ( ne trouve pas l'image par exemple ) il se peut que SDL_Blit plante ( car recevant un pointeur NULL) ... et que le programme plante ( erreur de segmentation )
    Après je dis ça, j'ai toujours pas regardé la doc.

    Pour il faut mieux stocker le resultat de SDL_LoadBMP, c'est très simple:

    Premièrement , pour supprimer la surface par la suite ( désallocation de mémoire )
    Deuxièmement, car les accès Disque dur sont lent, et que SDL_LoadBMP fait un accès disque dur, donc c'est à éviter. De plus rajouter une variable, tant qu'elle n'est pas desallouer, permet de reutiliser ta surface déjà chargé ( donc pas besoin de la chargé plein de fois ).

    Sinon, sur le site, il y a un excellent tuto sur la SDL ( celui de Loka ).
    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.

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

Discussions similaires

  1. Petite question relative à freopen + SDL
    Par _Fenrir_ dans le forum SDL
    Réponses: 1
    Dernier message: 22/09/2012, 11h41
  2. Petites questions d'un débutant en SDL
    Par sugarcoma dans le forum SDL
    Réponses: 6
    Dernier message: 13/01/2009, 12h07
  3. Petite question de memoire
    Par CaptnB dans le forum C++
    Réponses: 12
    Dernier message: 06/07/2005, 14h59
  4. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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