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 :

Pb de performances


Sujet :

SDL

  1. #1
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 889
    Points
    1 889
    Par défaut Pb de performances
    Bonjour,
    Je m'interroge sur les performances assez mediocres d'un programme sous linux utilisant SDL sur lequel je travail actuellement. Suite a la lecture de quelques posts si dessous, je me demande si il est judicieux d'ecrire directement sur la surface alloué pour l'ecran avec SDL_SetVideoMode() ou si il vaut mieux travailler sur une autre surface de la meme taille et seulement à la fin la blitter sur le "screen".
    J'ajoute que j'utilise bien le double buffering, l'acceleration hardware etc.. et que ma carte graphique est bien configurée pour l'acceleration 3D, ce qui me laisse encore plus perplexe :'( , j'ai peur pour les performances sur une config sans acc. 3D :s

  2. #2
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Qu'utilise tu pour dessiner?
    - tes propres méthodes d'affichage 2D
    - OpenGL
    - autre chose

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Déjà il faut relativiser tes résultats, au dessus d’une soixantaine de fps ce n’est pas significatif.

    Ensuite SDL ne sera pas accéléré par ta carte graphique avec sa partie 3D car SDL est une API 2D. Pour que ta carte optimise les calcul tu devra utilisé pour l’affichage une API 3D comme OpenGL que tu peut interfacé avec SDL.

    Avec plus de détail on pourra plus facilement de dire si tu as un problème ou pas.

  4. #4
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 889
    Points
    1 889
    Par défaut
    Voila ce que j'essaye de faire, le but final serait une sorte de rpg mais rien n'est definit encore je compte surtout m'amuser et apprendre le maniment de sdl et la 2d en général ( j'ai de bonnes connaissances en opengl par contre ça devrait pouvoir m'aider ) : j'ai un personnage qui se trouve dans ce que j'ai appelé une zone, pour exemple la premiére zone que j'ai decrite fait 3200x2400 pixels, à l'arrivée dans une zone, le programme charge les images qui y apparaitront et leurs coordonnées dans cette zone ( assez peut pour l'instant je compte bien sur m'en servir plusieurs fois dans chaque zone, par exemple l'herbe au sol etc..). Selon la position du personnage, le programme va chercher les surfaces ou bout de surface à afficher à l'ecran et realise le blit.

    Sur mon pc fixe, je bloque mes fps au rafraichissement de mon ecran, mais sur mon portable bien sur moins performant ( mais config honorable et drivers 3d ) et qui tourne sous linux, apres quelques blit je me retrouve à un peu moins de 50 img /s, enfin en dessous de mon rafraichissement ce qui me laisse perplexe pour l'avenir quand j'aurais vraiment pas mal de truc à afficher.

    Au moins pour les surface hw, sdl utilse ma cg pour optimiser le code, mais par exemple pour l'alpha blending, il est impossible de se servir des surfaces en memoire vidéo, et je compte me tourner vers opengl à terme, mais pour l'instant j'aimerais pouvoir faire tourner mon programme honorablement meme sur les configurations sans accelerations 3d (je pense pricinpalement aux linux ou seuls les drivers generiques sont installés)

    Ma premiére zone contient 4 images différentes 800.600 plus trois objets plus petits 400.400 environ. Je superpose mon personnage en alpha blending (pixel par pixel =x ) mais bizzarement ce n'est pas lui qui fait chuter les performances.

    Voici le code qui regarde quels sont les objets appartenant a la zone :

    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
     
    void World::draw(SDL_Surface* screen,int posx,int posy) // posx et posy renseignent la 
                   					    // position du joueur
    {
    	static int sx,sy,fx,fy;
    	static int coin1_X,coin1_Y,coin2_X,coin2_Y,coin3_X,coin3_Y;
    	static int s_posX,s_posY;
    	//coordonnées dans le monde des 4 coins de l'ecran
    	sx = posx-RES_X/2;
    	sy = posy-RES_Y/2;
    	fx = posx+RES_X/2;
    	fy = posy+RES_Y/2;
     
    	objet *objet = actualZone.objets;
    	sprite *sprite = actualZone.sprites;
     
    	for&#40;int i=0;i<actualZone.nbobjet;i++&#41;
    	&#123;
    		// un objet est renseigné par sa position = le coin superieur gauche l'ecran
    		// on deduit les 3 autres coins avec la taille de la sprite qui le represente
    		coin1_X = objet&#91;i&#93;.posx + sprite&#91;objet&#91;i&#93;.numsprite&#93;.sizeX&#40;&#41;;
    		coin1_Y = objet&#91;i&#93;.posy + sprite&#91;objet&#91;i&#93;.numsprite&#93;.sizeY&#40;&#41;;
     
    		coin2_X = objet&#91;i&#93;.posx + sprite&#91;objet&#91;i&#93;.numsprite&#93;.sizeX&#40;&#41;;
    		coin2_Y = objet&#91;i&#93;.posy;
     
    		coin3_X = objet&#91;i&#93;.posx;
    		coin3_Y = objet&#91;i&#93;.posy + sprite&#91;objet&#91;i&#93;.numsprite&#93;.sizeY&#40;&#41;;
     
    		//on cherche les objets qui sont dans l'ecran
    		if &#40;&#40;&#40;objet&#91;i&#93;.posx >= sx&#41; && &#40;objet&#91;i&#93;.posx <= fx&#41; && &#40;objet&#91;i&#93;.posy >= sy&#41; && &#40;objet&#91;i&#93;.posy <= fy&#41;&#41; ||
    		   &#40;&#40;coin1_X >= sx&#41; && &#40;coin1_X <= fx&#41; && &#40;coin1_Y >= sy&#41; && &#40;coin1_Y <= fy&#41;&#41; ||
    		   &#40;&#40;coin2_X >= sx&#41; && &#40;coin2_X <= fx&#41; && &#40;coin2_Y >= sy&#41; && &#40;coin2_Y <= fy&#41;&#41; ||
    		   &#40;&#40;coin3_X >= sx&#41; && &#40;coin3_X <= fx&#41; && &#40;coin3_Y >= sy&#41; && &#40;coin3_Y <= fy&#41;&#41;&#41;
    		&#123;
    			//on calcul la position dans l'ecran
    			s_posX = objet&#91;i&#93;.posx - sx;
    			s_posY = objet&#91;i&#93;.posy - sy;
    			sprite&#91;objet&#91;i&#93;.numsprite&#93;.draw&#40;screen,s_posX,s_posY&#41;;
    		&#125;
    	&#125;
    &#125;
    celui qui decoupe les sprites en vue de savoir quelles parties doivent etre dessinée à l'ecran

    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
     
    void sprite&#58;&#58;draw&#40;SDL_Surface* screen,int x,int y&#41;
    &#123;
        static int x_b,y_b,fx_b,fy_b;
    	static int x_s,y_s;
     
    	x_b=0;
    	y_b=0;
    	fx_b=sizeX&#40;&#41;;
    	fy_b=sizeY&#40;&#41;;
    	x_s=x;
    	y_s=y;
     
    	if&#40;x<0&#41;
    	&#123;
    		x_b=-x;
    		x_s=0;
    	&#125;
    	if&#40;&#40;x+sizeX&#40;&#41;&#41; > RES_X&#41;
    	&#123;
    		fx_b=RES_X-x;
    	&#125;
    	if&#40;y<0&#41;
    	&#123;
    		y_b=-y;
    		y_s=0;
    	&#125;
    	if&#40;&#40;y+sizeY&#40;&#41;&#41; > RES_Y&#41;
    	&#123;
    		fy_b=RES_Y-y;
    	&#125;
    	Blit&#40;img,x_b,y_b,fx_b,fy_b,screen,x_s,y_s&#41;;
    &#125;
    et la fonction qui se charge du blit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    inline void Blit&#40;SDL_Surface* source,int x1,int y1,int w,int h,SDL_Surface* dest,int x2,int y2&#41;
    &#123;
    	static SDL_Rect s;
    	s = Rect&#40;x1,y1,w,h&#41;;  //Découpe d'un morceau sur l'image source
    	static SDL_Rect d;
    	d = Rect&#40;x2,y2,0,0&#41;;  //Cible sur la seconde surface
    	SDL_BlitSurface&#40;source,&s,dest,&d&#41;;  //Copier-coller  source-cible
    &#125;
    Voila, il doit y avoir soit dans ma façon de procéder, soit dans mon code quelquechose qui ne tourne pas rond =( bien sur ici toutes les prites sont chargée en hw.

Discussions similaires

  1. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 16h39
  2. Performance xml
    Par MicKCanE dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/07/2003, 07h41
  3. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 17h18
  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, 11h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 12h41

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