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 :

performance, blitsurface


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Par défaut performance, blitsurface
    Bonjour,
    je me lance dans un pong.
    COncrètement je le vois comme ceci:
    -une surface screen (l'écran)
    -une surface bg (l'arriere plan qui est un bitmap)
    -une surface srcbuf (ma surface dans laquelle je déssine ce dont j'ai besoin)

    1) Déja, est ce que l'utillisation de 3 surfaces réduit les performance (en testant avec un bmp de 640*480 et 24bits, le résultat est beaucoup plus lent, j'ai changé le bmp en un un bmp 16 couleurs, c'est déja mieux, mais c'est limité).

    ensuite, je déssine un premier carré sur srcbuf,que je fais déplacer, et que je blitte sur screen. Il en résulte que je repains l'écran de la couleur du carré, normal.
    Donc je déssine un second carré de la couleur de l'arriere plan, qui se déplace un pixel plus tot que mon premier carré et la pas de problème mon carré se déplace bien tout seul. (j'éspère etre clair :p).

    Mon code fonctionne tres bien. Seulement les performmances m'ammènent a penser qu'il ne s'agit pas la bonne méthode.

    2)Existe t'il une autre méthode pour éffacer la derniere position de mon carré.(une sorte d'inverse de blitsurface)?

    En espérant etre clair, désolé ca n'est pas tres évident, merci.

  2. #2
    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
    Citation Envoyé par skysee
    1) Déja, est ce que l'utillisation de 3 surfaces réduit les performance (en testant avec un bmp de 640*480 et 24bits, le résultat est beaucoup plus lent, j'ai changé le bmp en un un bmp 16 couleurs, c'est déja mieux, mais c'est limité).
    Cela dépend, il y a beaucoup de choses qui peuvent accélérer le programme. Utilisé SDL_DisplayFormat par exemple. Voir la FAQ.

    2)Existe t'il une autre méthode pour éffacer la derniere position de mon carré.(une sorte d'inverse de blitsurface)?
    Oui, une meilleure solution est de juste blitter la partie de l'image de fond où se trouve le sprite à la place d'afficher le tout à chaque image.

    Jc

  3. #3
    Membre confirmé Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Par défaut
    Citation Envoyé par fearyourself
    Oui, une meilleure solution est de juste blitter la partie de l'image de fond où se trouve le sprite à la place d'afficher le tout à chaque image.
    C'est ce que je pense déjà faire, est ce que c'est ce à quoi tu pense?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          	SDL_BlitSurface(bg, NULL, screen, &recbg);//la j'ai mi NULL parce que bg est initialidé avec bg = SDL_LoadBMP("bg.bmp"); donc déja a la bonne taille
          	SDL_BlitSurface(srcbuf, &recPcache, screen, &dstPcache);//rectangle pour caché l'ancienne position de rec
          	SDL_BlitSurface(srcbuf, &rec, screen, &dst);

  4. #4
    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
    Citation Envoyé par skysee
    C'est ce que je pense déjà faire, est ce que c'est ce à quoi tu pense?
    Ben si tu dessines le fond a chaque fois ce n'est pas la peine de t'embeter... je pensais plutot a ceci :

    Tu copies sur un buffer temporaire le fond une fois au debut du programme.

    Ensuite pour chaque rendu, tu effaces du buffer l'ancienne position du sprite et u met le sprite sur la nouvelle position.

    Jc

  5. #5
    Membre confirmé Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Par défaut
    Vraiment désolé, j'ai peu de ne pas comprendre,

    je colle ici mon code qui n'est pas tres compliqué,
    Mais j'ai justement l'impréssion de me compliqué la vie la:

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
     
     
    SDL_Surface *screen;
    SDL_Surface *srcbuf;
    SDL_Surface *bg;
     
    void initSDL();
     
    int main(int argc, char *argv[])
    {
      	int done = 0;
      	SDL_Event event;
      	/*rec : rectangle temporaire chargé sur scrbuf
      	  dst : rectangle qui va recevoir rec sur screen
      	  recPcache : rectangle temporaire chargé sur srcbuf
      	  dstPcache : rectangle qui va recevoir recPcache sur screen et qui va cacher l'ancienne position de dst
      	*/
      	SDL_Rect rec, dst, recPcache, dstPcache, recbg;
      	Uint8 *keys;
    /*   INITIALISATION DES SURFACES */	
    	initSDL();//initialisation de screen
     
      	srcbuf = SDL_CreateRGBSurface 
    	(
          SDL_SWSURFACE,
          640,
          480,
          screen->format->BitsPerPixel,
          screen->format->Rmask,
          screen->format->Gmask,
          screen->format->Bmask,
          screen->format->Amask
    	);
     
    	bg = SDL_LoadBMP("bg.bmp");//chargement d'une image de fond dans la surface bg
    /*********************************/	
    	rec.x=0;
    	rec.y=0;
    	rec.h=200;
    	rec.w=200;
     
    	recbg.x=0;
    	recbg.y=0;
    	recbg.h=200;
    	recbg.w=200;
     
    	dst.x = 100;
    	dst.y = 100;
    	dst.h = 200;
    	dst.w = 200;
     
      	recPcache.x = 200;
      	recPcache.y = 200;
      	recPcache.h = 200;
      	recPcache.w = 200;
     
      	dstPcache.x = 100;
    	dstPcache.y = 100;
    	dstPcache.h = 200;
    	dstPcache.w = 200;
    	//Enregistrement de rec sur srcbuf ainsi que recPcache	
    	SDL_FillRect(srcbuf, &rec, SDL_MapRGB(srcbuf->format, 0, 0, 255));
    	SDL_FillRect(srcbuf, &recPcache, SDL_MapRGB(srcbuf->format, 0, 0, 0));
     
    	while(done == 0)
    	{
    		while(SDL_PollEvent(&event))
    		{
    			switch(event.type)
    			{
    				case SDL_QUIT:
    				done = 1;
    				break;
    			}
    		}
     
    		keys = SDL_GetKeyState(NULL);
     
    		if(keys[SDLK_UP])
          	{
    			dst.y-- ;
    			dstPcache.y = dst.y + 1;//on cache la position d'avant
          	}
          	if(keys[SDLK_DOWN])
          	{
    			dst.y++;
    			dstPcache.y = dst.y - 1;//on cache la position d'avant
          	}
          	if(keys[SDLK_RIGHT])
          	{
    			dst.x++;
    			dstPcache.x = dst.x - 1;//on cache la position d'avant
          	}
          	if(keys[SDLK_LEFT])
          	{
     
    			dst.x--;
    			dstPcache.x = dst.x + 1;//on cache la position d'avant
          	}
          	SDL_BlitSurface(bg, NULL, screen, &recbg);//on charge l'arriere plan
          	SDL_BlitSurface(srcbuf, &recPcache, screen, &dstPcache);//on charge le rectangle pour cacher
          	SDL_BlitSurface(srcbuf, &rec, screen, &dst);//on charge le rectangle visible
     
          	dstPcache.x = dst.x;//mise a jour des cordonnées du rectangle pour caché
          	dstPcache.y = dst.y;
     
    		SDL_Flip(screen);
    	}
     
     
    	SDL_FreeSurface(srcbuf);
    	SDL_FreeSurface(bg);
    	return 0;
    }

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         	SDL_BlitSurface(bg, NULL, screen, &recbg);//on charge l'arriere plan
          	SDL_BlitSurface(srcbuf, &recPcache, screen, &dstPcache);//on charge le rectangle pour cacher
          	SDL_BlitSurface(srcbuf, &rec, screen, &dst);//on charge le rectangle visible
    Je ne vois pas l'intêret de ce code. Si déjà tu copies toute l'image de fond, pourquoi vouloir cacher le sprite? Il n'est pas encore sur l'image de fond.

    Il y a deux techniques pour dessiner en 2D:

    A chaque image
    Dessiner le fond
    Dessiner toutes les images (persos, objets)
    Faire un flip
    ou

    Dessiner le fond sur un buffer au début

    A chaque image
    Recopier les parties du fond sur lesquels se trouves les objets du jeu (ils ont pu bouger)
    Dessiner toutes les images sur cette image de fond
    Copier le buffer dans le screen
    Faire un flip
    Toi tu fais un mélange bizarre des deux. Ensuite tu n'utilises pas SDL_DisplayFormat et tu ne testes pas le retour de SDL_CreateSurface, ce n'est pas bien!

    Je te conseille de rester sur la première méthode pour l'apprentissage... Donc tu fais simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      	SDL_BlitSurface(bg, NULL, screen, &recbg);//on charge l'arriere plan
          	SDL_BlitSurface(srcbuf, &rec, screen, &dst);//on charge le rectangle visible
    Jc

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

Discussions similaires

  1. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39
  2. Performance xml
    Par MicKCanE dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/07/2003, 06h41
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

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