Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: 16 millisecondes pour un simple window.display qui n'affiche rien : normal?  (Lu 6362 fois)

0 Membres et 1 Invité sur ce sujet

aniwey

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Bonjour!

Cela fait longtemps que je n'ai pas utilisé la SFML et j'y reviens depuis peu pour un projet. Cependant je rencontre un problème : l'affichage me semble assez lent. Lorsque je fais un display() sur un renderWindow qui n'affiche rien, cela prend en moyenne 16 millisecondes. Quand quelque chose doit être affiché (un simple fond rouge), c'est alors très chaotique : entre 8 et 20 millisecondes par boucle d'affichage..

Voici le code minimal qui produit le problème :

#include <SFML/Graphics.hpp>
#include <iostream>

int main(void){
  sf::RenderWindow window(sf::VideoMode(800, 600), "test");
  sf::Clock clock;
  float a;

  a = clock.getElapsedTime().asSeconds();
  for(int i = 0; i < 100; ++i){
    window.display();
  }
  std::cout << clock.getElapsedTime().asSeconds() - a << std::endl;
}
 

Ce bout de code affiche des valeurs légèrement supérieures à 1.6 en moyenne, soit 1.6 secondes pour 100 affichages. Est-ce normal? Cela peut-il venir de mon ordinateur? (pas de carte graphique, chipset Intel, sur une archlinux mise à jour)

Merci d'avance!

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 16 millisecondes pour un simple window.display qui n'affiche rien : normal?
« Réponse #1 le: Janvier 14, 2013, 09:31:02 pm »
16 ms ça fait 60 fps. Est-ce que la synchro verticale ne serait pas activée dans les paramètres de ton pilote graphique ?
Laurent Gomila - SFML developer

aniwey

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : 16 millisecondes pour un simple window.display qui n'affiche rien : normal?
« Réponse #2 le: Janvier 14, 2013, 10:22:31 pm »
Effectivement, ça a l'air d'être ça... En regardant le man de mon pilote ("man intel") :

       Option "SwapbuffersWait" "boolean"
              This option controls the behavior of glXSwapBuffers and glXCopySubBufferMESA calls by GL applications.  If enabled, the calls will avoid tearing by making sure the display scanline is outside of the
              area  to  be  copied  before the copy occurs.  If disabled, no scanline synchronization is performed, meaning tearing will likely occur.  Note that when enabled, this option can adversely affect the
              framerate of applications that render frames at less than refresh rate.

              Default: enabled.

Du coup, j'imagine qu'on ne peut pas contourner la chose sans demander aux utilisateurs de désactiver leur synchro verticale ou sans faire du threading? ^_^

Merci beaucoup en tout cas pour cette réponse rapide :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 16 millisecondes pour un simple window.display qui n'affiche rien : normal?
« Réponse #3 le: Janvier 15, 2013, 08:00:14 am »
Oui, ce sont les utilisateurs qui décident de ce genre de paramètre.
Laurent Gomila - SFML developer