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

API graphiques Discussion :

[boucles for] bcp sprites = effondrement fps


Sujet :

API graphiques

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut [boucles for] bcp sprites = effondrement fps
    Bonjour,

    J'utilise actuellement la SFML pour développer un petit jeu.
    >> J'aurais juste besoin d'afficher environ 300 petites images de 40x40 pixels, pour créer un terrain (le terrain doit être "modulable").
    Or, au bout d'environ 45 sprites affichés, le fps chute vite.
    - 45 sprites = ~47 images/sec.
    - 300 sprites = ~27 images/sec.


    Comment, donc, afficher un tableau d'images de la manière la plus optimisée possible, sans passer par un "double for( )" (en cascade) ?

    Merci pour votre aide !
    Sébastien.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    Personnellement j'ai créé une classe Display qui gérant une liste STL contenant tout les sprites a afficher.

    à chaque affichage je trie cette liste du plus près du centre de l'écran au plus loin, et j'affiche avec un for qui commence du premier élément jusqu'à l'élément dont la distance est plus petite que XXXXX, ainsi le traitement se fait que sur les éléments affiché a l'écran et il n'y a pas de gros ralentissement du fps.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Salut Cyber_N ce n'est pas beaucoup 45 sprites
    Pour le projet de jeu que je développe je ne sais combien de sprites sont affichés à l'écran .

    ( http://www.developpez.net/forums/d75...apoleoniennes/ )

    Quelle est ta machine ? J'obtiens 75 fps sur une machine récente.

    Par contre il faut que tu fasses des opérations de découpage ( afficher la partie visible seulement d'un sprite à l'écran ).
    Faire une opération de clipping augmente considérablement les performances.
    Je crois avoir vu une classe qui fait cela avec SFML ou bien une méthode

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut Une piste pour la Résolution de l'effondrement
    Bonjour à vous deux et Merci pour vos aides.

    Bebaijhi, le concept dont tu parles viens quand le jeu est, sans doute, déjà bien avancé. Je tente pour l'instant de savoir combien je en afficher au maximum sans altérer le fps. C'est une bonne astuce que tu décris là. Merci.

    Mat.M, bravo pour le développement de ton jeu (sur la démo, je ne peux pas sélectionner d'unités).
    Effectivement, 45 sprites c'est extrêmement peu ... même si je découpe bien mes affichages.
    * Ma machine : Athlon XP 2400+, 2GHz, 2Go Ram, GeForce 3.


    J'ai finalement réussi à me dépatouiller de ce problème. La solution :
    - Jeter un oeil au code source SFML : on apprend beaucoup de choses ! ...
    - La solution est de coder en OpenGL : tout affichage SFML est codé avec.
    > J'ai donc utilisé des macros et des fonctions OpenGL (glBegin(), glVertex(), obtention des coordonnées de texture d'une sf::Image, etc ... ), le tout dans un "for()" dans ma méthode redéfinie : "Render" qui provient de la classe "Drawable()" qui est toujours exportée dans un objet Affichable (Sprite par ex.).
    > Et là, on peut afficher des tonnes d'images avec un fps qui n'a pas perdu un cheveux.
    Trop facile !

    Sébastien.

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Salut Cyber_n merci pour les remarques et content que cela ait permis de te dépatouiller

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut Un peu de code pour illustrer ...
    Bonsoir Mr. Mat.M !

    Un bout de code, même sommaire et résumé, est mieux qu'un long discours :

    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
     
    // CODE : affichage d'un tableau de blocks image avec OpenGL en utilisant 
    // une image qui contient une palette de petites images.
    // NOTE : void 'VOTRECLASSE'::Render(sf::RenderTarget&) const{ ... } est
    // appelée lorsque vous utilisez, à l'extérieur de la classe 'VOTRECLASSE', ce 
    // code : RenderWindow* fenetre; fenetre->Draw( 'VOTRECLASSE' );
     
    for( int cx=this->blkX; cx<nbBlockX; cx++ ){
    	for( int cy=this->blkY; cy<nbBlockY; cy++ ){
     
    		glMatrixMode(GL_MODELVIEW);
    		glPushMatrix();
     
    		sf::Rect<float> Rect;
    		sf::IntRect RectImage;
     
    		int largeur = this->palImages->GetWidth();
     
    		RectImage.Left	= ...
    		RectImage.Top  = ...
    		RectImage.Top  = ...
    		RectImage.Right = ...
    		RectImage.Bottom = ...
     
    		Rect = this->palImages->GetTexCoords( RectImage );
    		this->palImages->Bind();
     
    		float x = (float)( (cx)*this->dimBloc ... ;
    		float y = (float)( (cy)*this->dimBloc ... ;
    		glTranslatef( x, y, 0.0f );
     
    		glBegin(GL_QUADS);
    		 glTexCoord2f(Rect.Left, Rect.Top);	 glVertex2i(0, 0);
    		 glTexCoord2f(Rect.Left, Rect.Bottom);	glVertex2i(0, dimBloc);
    		 glTexCoord2f(Rect.Right, Rect.Bottom); glVertex2i(dimBloc, dimBloc);
    		 glTexCoord2f(Rect.Right, Rect.Top);	 glVertex2i(dimBloc, 0);
    		glEnd();
     
    		glMatrixMode(GL_MODELVIEW);
    		glPopMatrix();
    	}
    }
    Sébastien.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par cyber_N Voir le message
    Bebaijhi, le concept dont tu parles viens quand le jeu est, sans doute, déjà bien avancé.
    A vrai dire non, c'est le premier truck que je met en place dans un jeu, avec d'autre classes ( Sprite par exemple ) pour avoir une base solide. cela permet après de tout simplifier!

    par exemple, avec ma classe Display et ma classe Sprite pour afficher un sprite il suffit de faire:

    évidement tu ne code cette classe qu'une seule fois, après tu réutilise la même dans tes autres projets.

  8. #8
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Tout dépend ton niveau en programmation, si tu es débutant tu essayera d'abord d'obtenir quelque chose à l'écran le plus vite possible puis de faire évoluer ce quelque chose en quelque chose de plus gros. Un développeur plus expérimenté, commencera plutôt par faire une structure bien complète qui pendant un bon moment n'affichera rien du tout mais qui sera une base réellement solide pour la suite du projet.

    Je ne connais pas du tout la SFML mais vu que ça à l'air d'utiliser OpenGL et que je vois des glBegin, glVertex (ahhh horreur ) je suppose que tu débute. Enfaite là tu fais une boucle qui envoie les vertex de chaque quad par le bus PCI toutes les frames, ce qui est très lourd. Ce que je te conseille pour la suite si tu veux bien optimiser (ça fait vraiment gagner beaucoup) c'est d'utiliser les Vertex Buffer Object (VBO). Pour résumer tu ne stocke que 4 points (un quad) dans un buffer (grâce au VBO tu pourras mettre ce buffer sur la mémoire graphique ce qui éliminera les nombreux transferts par le bus PCI a chaque frame, la tu le fais juste une fois à l'initialisation de ton VBO). Puis quand tu veux afficher un quad tu fais simplement un glTranslate avec les coordonnées du quad par exemple et un glDrawElements qui affichera ton quad.

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

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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