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

OpenGL Discussion :

Les lignes verticales, c'est traitre


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut Les lignes verticales, c'est traitre
    Bonjour,

    je viens vous faire part d'un problème sur lequel je bute depuis des heures, sans trouver d'explication.

    1- Je dessine ma scène
    2- Je veux donner un effet de scanlines

    Pour l'effet de scanlines, je me contente de dessiner, tous les deux pixels en X, une ligne qui va de bas en haut de l'écran.

    Et a ma grande surprise mon fps se retrouve divisé par quatre quand j'active le dessin de ces lignes (que je sois caler sur la synchro verticale ou non).

    A ma plus grande surprise encore, le phénomène n'a pas lieu quand je dessine des lignes horizontales. Aucun impact sur le fps.

    Je me dis alors que c'est un bug dans les drivers de mon ridicule nVidia 6150 (chipset intégré à la carte mère), et je décide d'implémenter ça sous forme d'une texture faite d'une alternance de ligne/pas ligne.

    Et la je tombe carrément sur le cul. Parce que quand je dessine ma texture dans le sens qu'il faut pour faire des lignes horizontales, pas de problème. Mais si je la dessine dans l'autre sens, pour avoir des lignes verticales, le phénomène se reproduit. La chute de fps est moins importante, mais tout de même énorme.

    Comme si mon 6150 avait un souci avec les motif du genre ligne verticale.

    J'ai mesurer le temps d'exécution a différents endroits dans mon code, et ce qui est étonnant, c'est que la tracé des lignes prend peu de temps en lui même, mais par contre le temps d'exécution du swap (je suis en double buffer) explose des que je dessine ces foutues lignes...

    évidemment j'ai essayer différents toolkit, GLFW et freeGlut, mais ça ne change rien.

    j'ai essayer d'activer ou de désactiver le blending lors du dessin de mes lignes, et la chute de performance est un peu moins importante quand pas de blending, mais toujours très importante.

    J'ai essayer aussi de dessiner des quads épais d'un pixel au lieu de vraies lignes (ahah la ruse !) mais rien a faire.

    Autre petite indication, plus je dessine ces lignes verticales sur une surface importante de l'écran, plus le ralentissement est grand. moins j'en dessine plus le ralentissement est faible. Ce qui bien évidement exclu les histoires d'attente de prochaine synchro avant swap pour cause de temps de rendu trop long.

    Bon bref je suis au bord de la crise nerveuse, j'ai des tremblements et je commence a ne plus sentir mon corps. Quelqu'un a t il une idée de ce qui se passe.

    voilà un example :

    http://kanjiscope.free.fr/mystere.cpp

    est ce que le phénomène existe chez vous, en commentant et en decommentant la fonction scanlinize() ?


    Merci d'avance à ceux qui pourront m'aider !


    Robeeeert

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    6150 => pas de mémoire vidéo, donc mémoire partagé avec le système.

    tous les frame buffer sont implémenté en scan line, donc quand tu dessine une ligne horizontal, le cache est heureux, car tu va écrire des pixels adjacents en mémoire. par contre, dès que tu écris des pixel verticaux (ou en diagonale, ça doit donner le même résultat), la c'est la catastrophe pour lui.

    en fait, ton problème ce n'est pas que le dessin de ligne vertical qui est plus lent, mais le dessin des lignes horizontales qui est nettement plus rapide (a cause du cache)
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Bon déjà sur le temps de rendu des lignes vs temps passé dans la fonction swap : tu ne peux pas mesurer le temps de rendu d'un draw call en mesurant le temps CPU passé dans ce draw call. OpenGL va mettre les commandes dans un push buffer (tampon de commandes) et donc seul le temps passé de frame à frame est une bonne estimation globale (sur une période de trois/quatre frames pour absorber les variations). Il y a des méthodes plus complexes comme l'utilisation de GPU view sous Vista, ou l'utilisation des time stamps mais c'est un peu compliqué pour ton problème.

    Pour ton problème de performance, c'est possible que tu aies un problème lié effectivement à l'organisation des pixels en mémoire.

    Concernant l'histoire de la texture contenant les lignes, vérifie que ta texture est en puissance de deux. En théorie si tu fais une ligne sur deux, ta texture ne doit pas dépasser le 2x2 texels. à cette taille là, il y a des bonnes chances que la texture reste dans le cache le temps du tracé.

    Si tu as bien des problèmes d'organisation mémoire, essaie plusieurs stratégies de tracé différentes, bouts de lignes horizontaux de tailles différentes, simple quad texturé avec la texture ci-dessus, bouts de quads qui quadrillent ton écran et organisés horizontalement puis verticalement. Essaie de voir si le problème diminue avec la résolution. Assure toi aussi que tu as le depth test/depth write off entre autres.

    Sinon plutot que de faire l'effet scanline comme un post process, si tu as un slot de texture libre lors du tracé initial, rien ne t'interdit de lire ta texture contenant la grille et de multiplier la couleur de chaque objet tracé par cette texture (en supposant que tu traces des lignes noires). Les différences de perfs avec ta première approche dépendront probablement de ton "overdraw".

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut
    Merci pour ces réponses, je vais essayer de voir ce que ça donne.

Discussions similaires

  1. Réponses: 23
    Dernier message: 01/08/2008, 14h35
  2. Comment afficher les lignes lorsque la valeur est vide ?
    Par matimat2k4 dans le forum Langage SQL
    Réponses: 24
    Dernier message: 02/04/2008, 17h29
  3. Réponses: 2
    Dernier message: 27/02/2008, 19h45
  4. masquer les lignes dans une zone si une cellule de la ligne est vide
    Par keguira dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/11/2006, 19h21
  5. Réponses: 5
    Dernier message: 24/07/2006, 15h01

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