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 :

Precision FPS, Blittage


Sujet :

SDL

  1. #1
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut Precision FPS, Blittage
    Bonjour,

    Mon titre n'est certainement pas clair, alors je m'explique

    Je cherche a faire un scrolling.
    L'idée est que je puisse aller dans n'importe quelle direction, et que si jamais la camera dépasse du fond d'écran, je blit au bonne endroit l'opposé.

    J'ai réussi à faire ceci.

    Cependant, en mettant des timer afin de me rendre compte de la durée de l'operation, SDL_GetTicks() me retourne une moyenne de 24.

    Je precise que je blit a chaque fois une fenetre de 900x700.

    Voici un extrait de mon code :
    (Je précise que la camera ne peut déborder qu'a droite et qu'en bas)
    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
     
                tempsTest = SDL_GetTicks();
     
                /* On verifie si tout l'ecran rentre dans la map */
                if ((camera.x + camera.w <= map->w) && (camera.y + camera.h <= map->h))
                    SDL_BlitSurface (map, &camera, ecran, NULL);
                else
                {
                    SDL_Rect partieHautGauche;
                        partieHautGauche.x = camera.x;
                        partieHautGauche.y = camera.y;
                        partieHautGauche.w = map->w - camera.x;
                        partieHautGauche.h = map->h - camera.y;
     
                    SDL_BlitSurface (map, &partieHautGauche, ecran, NULL);
     
                    SDL_Rect partieHautDroite;
                        partieHautDroite.x = 0;
                        partieHautDroite.y = camera.y;
                        partieHautDroite.w = camera.x + camera.w - map->w;
                        partieHautDroite.h = map->h - camera.y;
     
                    SDL_Rect positionPartieHautDroite;
                        positionPartieHautDroite.x = map->w - camera.x;
                        positionPartieHautDroite.y = 0;
     
                    SDL_BlitSurface (map, &partieHautDroite, ecran, &positionPartieHautDroite);
     
     
                    SDL_Rect partieBasGauche;
                        partieBasGauche.x = camera.x;
                        partieBasGauche.y = 0;
                        partieBasGauche.w = map->w - camera.x;
                        partieBasGauche.h = camera.y + camera.h - map->h;
     
                    SDL_Rect positionPartieBasGauche;
                        positionPartieBasGauche.x = 0;
                        positionPartieBasGauche.y = map->h - camera.y;
     
                    SDL_BlitSurface (map, &partieBasGauche, ecran, &positionPartieBasGauche);
     
     
                    SDL_Rect partieBasDroite;
                        partieBasDroite.x = 0;
                        partieBasDroite.y = 0;
                        partieBasDroite.w = camera.x + camera.w - map->w;
                        partieBasDroite.h = camera.y + camera.h - map->h;
     
                    SDL_Rect positionPartieBasDroite;
                        positionPartieBasDroite.x = map->w - camera.x;
                        positionPartieBasDroite.y = map->h - camera.y;
     
                    SDL_BlitSurface (map, &partieBasDroite, ecran, &positionPartieBasDroite);
     
                }
     
                cout << SDL_GetTicks() - tempsTest << "\n";



    1°) Est-il normal que cela me prenne autant de temps ?
    2°) Si non, ou se situerai l'amelioration ?

    J'en viens au FPS.

    J'ai definie mes FPS a 100, donc les operation de blittage vont s'efectuer toutes les 10 milliseconde. Or, l'operation de blittage prend deja 24 milliseconde (si je ne m'abuse).

    3°) A combien de FPS fixez vous en general un petit jeu (qui bouge beaucoup) ?
    4°) 100 FPS est-il trop grand ?

    Je ne souhaiterai pas de lien vers la SFLM, je doit rester sous SDL.

    Merci.

  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 : 33
    Localisation : France

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

    Informations forums :
    Inscription : février 2008
    Messages : 308
    Points : 620
    Points
    620
    Par défaut
    tu devrais vérifier quelle partie (précisement) met autant de temps, vérifier le temps utilisé par chaque block de code. ça permettrais de savoir ou est le problème exactement.

    SFML est plus performant uniquement quand on affiche un grand nombre d'image il me semble. donc pas besoin de changer

  3. #3
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut
    Je crois que le cas est desesperé ...
    Je suppose que c'est parce que je blit une image de 900x700 car si je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                tempsTest = SDL_GetTicks();
     
                SDL_BlitSurface (map, NULL, ecran, NULL);
     
                cout << SDL_GetTicks() - tempsTest << "\n";
    J'obtiens encore et toujours 24~26 pour SDL_GetTicks();

    Y'a t'il un moyen pour augmenter la rapidité du blit ?
    J'avais un jour vu pour SDL_SetColorKey ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_SetColorKey(...,  SDL_RLEACCEL, ...);
    Le flag SDL_RLEACCEL permet-il d'accelerer reelement le Blit ?

  4. #4
    Expert éminent sénior

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    7 400
    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 : 7 400
    Points : 17 203
    Points
    17 203
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    3°) A combien de FPS fixez vous en general un petit jeu (qui bouge beaucoup) ?
    4°) 100 FPS est-il trop grand ?


    Merci.
    en théorie le nombre de FPS devrait être le taux de rafraichissement du moniteur en Hz
    Par exemple si ton moniteur a un taux de rafraichissement de 75 tu devrais limiter les FPS à ce nombre là.
    Un nombre de FPS élevé ne garantie pas forcément un jeu plus fluide.

    Il y a des gens qui s'amusent à toucher ce taux de rafraichissement pour leur jeu je déconseille de le faire sinon le jeu risque de ne pas tourner sur des machines moins puissantes.
    Il faut prendre celui réglé dans le panneau de configuration..

  5. #5
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut
    en théorie le nombre de FPS devrait être le taux de rafraichissement du moniteur en Hz
    Par exemple si ton moniteur a un taux de rafraichissement de 75 tu devrais limiter les FPS à ce nombre là.
    Un nombre de FPS élevé ne garantie pas forcément un jeu plus fluide.
    Je n'y avais jamais pensé
    Ca resoud deja pas mal de question.

    Sinon, j'essais encore de trouver comment acceler le blit, mais je crois que c'est perdu d'avance.

  6. #6
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut
    Y'a t'il un moyen pour augmenter la rapidité du blit ?
    J'avais un jour vu pour SDL_SetColorKey ceci :

    Code :

    SDL_SetColorKey(..., SDL_RLEACCEL, ...);

    Le flag SDL_RLEACCEL permet-il d'accelerer reelement le Blit ?
    Effectivement, cela ameliore la rapidite de facon flagrante !
    Je passe de 24~26 milliseconde a 3~4 milliseconde avec le flag SDL_RLEACCEL !!!

    Sinon, y'a t'il une fonction SDL permettant de savoir le taux de rafraichissement de l'ecran ? Merci

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 1 327
    Points : 1 446
    Points
    1 446
    Par défaut
    Tu peux récupérer pas mal de données, mais ça je crois pas.

    Après 60 Hz est un bon taux de rafraîchissement.

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


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

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

    Informations forums :
    Inscription : mai 2008
    Messages : 25 852
    Points : 205 047
    Points
    205 047
    Billets dans le blog
    83
    Par défaut
    De toute façon, je crois que windows bloque le rafraishissement de ces fenetres à la valeur qui est pour le moniteur.
    Enfin ça c'était pour un programme fait avec la winAPI ... donc je sais pas si la SDL subit le même truc.
    Sous linux je sais pas comment ça se passe.
    Mais du 60Hz, devrait être un bon compromis vitesse / prise de CPU
    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.

  9. #9
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut
    Bon et bien ...

    Toute mes questions sont résolu
    Maintenant, le scrolling est fluide, grâce au fameux flag.

    Je vais essayer de trouver d'autre moyen d'accélérer le blit.

    Merci a tous pour vos réponse et explication

  10. #10
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    De toute façon, je crois que windows bloque le rafraishissement de ces fenetres à la valeur qui est pour le moniteur.
    Enfin ça c'était pour un programme fait avec la winAPI ... donc je sais pas si la SDL subit le même truc.
    Sous linux je sais pas comment ça se passe.
    Mais du 60Hz, devrait être un bon compromis vitesse / prise de CPU
    Ouais, enfin bon, les drivers de ta carte graphique aussi.
    Si l'option de synchro verticale est activée, quel que soit el programme/jeux lancé, il tournera à la fréquence ton moniteur (enfin, si la carte suis ! ).

    Donc, passage apr les drivers, et la sdl fera de même.
    Le seul soucis, c'est que chaque personne configure ses drivers à sa façon, tout le monde n'as pas la sync vert d'activé (personnellement, toujours désactivé, ça consomme trop en perf).

    Je plussois la vitesse de 60Hz.

  11. #11
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut
    On doit aussi utiliser SDL_DisplayFormat(); afin de baisser le temps de blittage.
    J'obtiens des resultat comparable si j'utilise SDL_DisplayFormat(); ou le flag SDL_RLEACCEL. Par contre, si j'utilise les deux en meme temps, cela ne baisse pas plus que si j'utilise l'un des deux.

  12. #12
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : octobre 2006
    Messages : 1 327
    Points : 1 446
    Points
    1 446
    Par défaut
    Utilises SDL_DisplayFormat en priorité (d'ailleurs on devrait tout le temps le faire, et pour le alpha et tout je ne sais pas si RLE_ACCEL fait quelque chose)

  13. #13
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut
    Oui, je sais ...
    honte a moi.

    J'ai correctement initialisé tout mes sprites, mais pas celui-ci car il faisait partie d'un test (sur le scrolling justement) et je n'ai pas eu le reflexe d'utiliser DisplayFormat

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

Discussions similaires

  1. precision sur le pilotage du port parallele
    Par fransouik dans le forum C++Builder
    Réponses: 18
    Dernier message: 26/02/2004, 13h28
  2. (Debutant) resolution et fps
    Par silverdelph dans le forum DirectX
    Réponses: 4
    Dernier message: 12/07/2003, 12h50
  3. [VBA-E]Demande de précision sur les menus
    Par geffdenimes dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/06/2003, 10h46
  4. [MFC]Calculer les FPS
    Par inerti@ dans le forum MFC
    Réponses: 6
    Dernier message: 19/03/2003, 18h22
  5. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21

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