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 :

Plantage SDL linux


Sujet :

SDL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Plantage SDL linux
    Bonjour,

    Voila mon problème :

    J'ai créer un jeu en C avec un interface grace à la SDL sous linux.

    Pour eviter de trop me compliquer la vie j'ai décidé de ne charger que des images BMP plutot que de me lancer dans la creation de fonctions plus compliquées.

    Maintenant lorsque je lance mon programme tout fonctionne parfaitement mais après quelques tour de jeu et quelques actualisation de l'ecran le PC commence a ramer fortement.

    Et après ca linux qui le programme et "Killed" apparait dans la console...

    Est-ce un problème de mémoire ou quelque chose dans le genre?

    J'utilise le double buffer alors est ce que je doit free quelque chose a chaque SDL_flip(); ???

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Probable que ce soit un problème de mémoire, mais il faudrait voir ton code pour en savoir plus.

  3. #3
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Tu charges tes images souvent ?
    Mindiell
    "Souvent, femme barrit" - Elephant man

  4. #4
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Leguerinos
    J'ai créer un jeu en C avec un interface grace à la SDL sous linux.
    Très bonne idée !

    Pour eviter de trop me compliquer la vie j'ai décidé de ne charger que des images BMP plutot que de me lancer dans la creation de fonctions plus compliquées.
    Je ne vois pas le problème, tu peux soit rester en BMP (comme je fais souvent de toute facon) ou alors utiliser SDL_image qui permet d'avoir la belle fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *IMG_Load(const char *file);
    La description de SDL_image te donne le nombre de formats géré :
    This is a simple library to load images of various formats as SDL surfaces.
    This library supports BMP, PNM (PPM/PGM/PBM), XPM, LBM, PCX, GIF, JPEG, PNG, TGA, and TIFF formats.
    Et la seule chose qui change et d'inclure -lSDL_image à la compilation (et d'avoir le paquet développement de cette bibliothèque).

    Maintenant lorsque je lance mon programme tout fonctionne parfaitement mais après quelques tour de jeu et quelques actualisation de l'ecran le PC commence a ramer fortement.

    Et après ca linux qui le programme et "Killed" apparait dans la console...
    Je suis d'accord avec les autres :
    - Montre un code minimal qui expose ce problème
    - Regarde si tu ne t'amuses pas à charger inutilement tes images à chaque image.
    - Vérifie que tu libères tes images lorsque tu ne t'en sers plus

    Est-ce un problème de mémoire ou quelque chose dans le genre?
    Oui, à priori c'est fort probable.

    J'utilise le double buffer alors est ce que je dois free quelque chose a chaque SDL_flip(); ???
    Non, rien à voir.

    Jc

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    void affichage(espece **mer,humain *pecheur)
    {
    int i;
    int j;
    int k=0;
     
    int abscisse=0;
    int ordonnee=0;
     
    SDL_Surface* imageDeFond;
    SDL_Rect positionFond;
     
    positionFond.x=0;
    positionFond.y=0;
     
    imageDeFond = SDL_LoadBMP("image/fond.bmp");
    SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
     
     
    SDL_Surface* poisson;
    SDL_Rect position;
     
    for(i=0;i<TAILLE_MER;i++)
       {
        for(j=0;j<TAILLE_MER;j++)
    	{
     
    	position.x = 20 + abscisse; 
    	position.y = 5 + ordonnee;
     
     
    	if(i==(*pecheur).abscisse && j==(*pecheur).ordonnee)
    		{
    		poisson = SDL_LoadBMP("image/pecheur.bmp");
    		SDL_BlitSurface(poisson, NULL, ecran, &position); 
    		}
    	else if(mer[i][j].type==TYPE_MER)
    	{
    	poisson = SDL_LoadBMP("image/mer.bmp");
    	SDL_BlitSurface(poisson, NULL, ecran, &position);
    	}
    	else if(mer[i][j].type==TYPE_PLANCTON)
    	{
    	poisson = SDL_LoadBMP("image/plancton.bmp");
    	SDL_BlitSurface(poisson, NULL, ecran, &position); 
    	}
    	else if(mer[i][j].type==TYPE_CORAIL)
    	{
    	poisson = SDL_LoadBMP("image/corail.bmp"); 
    	SDL_BlitSurface(poisson, NULL, ecran, &position); 
    	} 
    	else if(mer[i][j].type==TYPE_BAR)
    	{
    	poisson = SDL_LoadBMP("image/bar.bmp");
    	SDL_BlitSurface(poisson, NULL, ecran, &position);  
    	}
    	else if(mer[i][j].type==TYPE_THON)
    	{
    	poisson = SDL_LoadBMP("image/thon.bmp");
    	SDL_BlitSurface(poisson, NULL, ecran, &position);  
    	}
     
    	k++;
    	abscisse=abscisse+24;
    	}
       abscisse=0;
       ordonnee=ordonnee+24;
       }
     
     SDL_Flip(ecran);
     
     
    }
    Voila un morceau de code typique qui est utilisé très souvent ...

    Effectivement je charge a chaque fois les meme images et je ne libère pas de memoire...

    Un ptit conseil serait bienvenue

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu charges tes images à chaque affichage (plusieurs fois par seconde) sans jamais les détruire ; tu m'étonnes que ta mémoire explose.

    Charge les une seule fois à l'initialisation de ton programme, et pense à les détruire lorsque tu n'en as plus besoin.

  7. #7
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Leguerinos
    [code]
    Voila un morceau de code typique qui est utilisé très souvent ...

    Effectivement je charge a chaque fois les meme images et je ne libère pas de memoire...

    Un ptit conseil serait bienvenue
    Il faut initialiser tes images dans un tableau au début de ton code avant le premier affichage mais après l'initialisation de SDL.

    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
     
    int init_images(SDL_Surface **images)
    {
        int i;
     
        /* On suppose que images est assez grand pour contenir ces pointeurs */
        images[FOND] = SDL_LoadBMP("image/fond.bmp");
        images[PECH] = SDL_LoadBMP("image/pecheur.bmp");
        images[MER] = SDL_LoadBMP("image/mer.bmp");
        images[PLANCTON] = SDL_LoadBMP("image/plancton.bmp");
        images[CORAIL] = SDL_LoadBMP("image/corail.bmp"); 
        images[BAR] = SDL_LoadBMP("image/bar.bmp");
        images[THON] = SDL_LoadBMP("image/thon.bmp");
     
        /* Verification des chargements, on suppose que FOND-THON sont des nbrs consecutifs*/
        for(i=FOND;i<=THON;i++) {
           if(images[i]==NULL) {
             return 0;
           }
        }
        return 1;
    }
    Ensuite, on passe ce tableau à ta fonction d'affichage
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    /* On passe le tableau d´images a cette fonction, le tableau est donc bien initialise */
    void affichage(espece **mer,humain *pecheur, SDL_Surface** images)
    {
    int i;
    int j;
    int k=0;
     
    int abscisse=0;
    int ordonnee=0;
     
    SDL_Surface* imageDeFond;
    SDL_Rect positionFond;
     
    positionFond.x=0;
    positionFond.y=0;
     
    SDL_BlitSurface(images[FOND], NULL, ecran, &positionFond);
     
     
    SDL_Surface* poisson;
    SDL_Rect position;
     
    for(i=0;i<TAILLE_MER;i++)
       {
        for(j=0;j<TAILLE_MER;j++)
    	{
     
    	position.x = 20 + abscisse; 
    	position.y = 5 + ordonnee;
     
     
    	if(i==(*pecheur).abscisse && j==(*pecheur).ordonnee)
    		{
    		SDL_BlitSurface(images[PECH], NULL, ecran, &position); 
    		}
    	else if(mer[i][j].type==TYPE_MER)
    	{
    	SDL_BlitSurface(images[MER], NULL, ecran, &position);
    	}
    	else if(mer[i][j].type==TYPE_PLANCTON)
    	{
    	SDL_BlitSurface(images[PLANCTON], NULL, ecran, &position); 
    	}
    	else if(mer[i][j].type==TYPE_CORAIL)
    	{
    	SDL_BlitSurface(images[CORAIL], NULL, ecran, &position); 
    	} 
    	else if(mer[i][j].type==TYPE_BAR)
    	{
    	SDL_BlitSurface(images[BAR], NULL, ecran, &position);  
    	}
    	else if(mer[i][j].type==TYPE_THON)
    	{
    	SDL_BlitSurface(images[THON], NULL, ecran, &position);  
    	}
     
    	k++;
    	abscisse=abscisse+24;
    	}
       abscisse=0;
       ordonnee=ordonnee+24;
       }
     
     SDL_Flip(ecran);
    }
    L'utilisation de define ou de constantes permet de simplifier le code.

    Poses des questions si tu ne comprends pas.

    Jc

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Merci c'est parfait

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

Discussions similaires

  1. Lancement application SDL linux
    Par foinfoin99 dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 11/01/2009, 22h03
  2. [linux]SDL (SETAlpha) + Sockets=plantage?
    Par strayyy dans le forum C++
    Réponses: 2
    Dernier message: 18/05/2008, 02h23
  3. Plantage SDL sous Ubuntu
    Par fabgamer dans le forum SDL
    Réponses: 6
    Dernier message: 04/06/2007, 12h14
  4. VMWARE et plantage RedHat linux ES 3.0
    Par Tsimplice dans le forum VMware
    Réponses: 3
    Dernier message: 14/04/2006, 20h24
  5. SDL sous linux .. undefined referenco to ...
    Par Happy dans le forum SDL
    Réponses: 4
    Dernier message: 24/11/2005, 15h54

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