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 :

Problème de double-buffering ?


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2012
    Messages : 2
    Par défaut Problème de double-buffering ?
    Bonjour,


    Je suis débutant dans le SDL et je me heurte à un problème en manipulant des images.. En fait, j'obtient un résultat différent sur 2 ordinateurs différents, avec le même code... Et après cherché plusieurs heures sur Internet, je pense à un problème de "double buffering".


    Je vous explique. Je m'entraine à manipuler les images. Je veux faire apparaître des images (de 220px de large) 1 par 1, l'une à côté de l'autre, tout en gardant les images précendent affichées. Comme je veux voir les images apparaître 1 par 1, je fais un SDL_Delay() entre chaque affichage, juste après le SDL_RenderPresent().


    Voici l'algorithme:

    <1.a J'ajoute ma 1ère image dans le renderer dans le coin supérieur gauche (0,0)>
    <1.b J'affiche l'écran : SDL_RenderPresent()>
    <1.c Je fais une pause de quelques ms : SDL_Delay()>

    <2.a. J'ajoute ma 2ème image, 220px plus loin, dans le renderer>
    <2.b. J'affiche l'écran : SDL_RenderPresent()>
    <2.c. Je fais une pause de quelques ms : SDL_Delay()>

    <3.a. J'ajoute ma 2ème image, 220px plus loin, dans le renderer>
    <3.b. J'affiche l'écran : SDL_RenderPresent()>
    <3.c. Je fais une pause de quelques ms : SDL_Delay()>

    <etc.>



    Ce code fonctionne sans problème sur un ordinateur. Et lorsque je le porte sur un autre, c'est là que je rencontre le problème, ça me fait ceci:
    - affichage de la 1ère image
    - affichage de la 2ème image uniquement
    - affichage de la 1ère et de la 3ème image uniquement
    - affichage de la 2ème et de la 4ème image uniquement
    - affichage de la 1ère, de la 3ème et de la 5ème image uniquement
    - affichage de la 2ème, de la 4ème et de la 6ème image uniquement

    Ca me fait penser à un problème de double-buffering. J'ai alors placé la fonction "SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 0);" juste après le "SDL_Init(SDL_INIT_VIDEO)" ... et voila que j'obtiens un écran tout blanc sans aucun affichage d'image. Là, je commence à en avoir un peu marre de chercher sur le net, alors je viens chercher de l'aide :-) "SDL_GL_SetAttribute()", c'est pour l'OpenGL, non? Alors, ça ne m'est pas utile pour ce que je fais je suppose? Comment désactiver le double-buffering dans mon cas?


    A noter que, si je modifie l'algorithme comme ceci, le problème est réglé, mais ce n'est pas très "propre" de faire plusieurs "SDL_RenderPresent()":

    <1.a. J'ajoute ma 1ère image dans le renderer>
    <1.b. J'affiche l'écran : SDL_RenderPresent()>
    <1.c. Je fais une pause de quelques ms : SDL_Delay()>
    <1.d. J'affiche l'écran une fois en plus : SDL_RenderPresent()>

    <2.a. J'ajoute ma 2ème image, 220px plus loin, dans le renderer>
    <2.b. J'affiche l'écran : SDL_RenderPresent()>
    <2.c. Je fais une pause de quelques ms : SDL_Delay()>
    <2.d J'affiche l'écran une fois en plus : SDL_RenderPresent()>

    <3.a. J'ajoute ma 2ème image, 220px plus loin, dans le renderer>
    <3.b. J'affiche l'écran : SDL_RenderPresent()>
    <3.c. Je fais une pause de quelques ms : SDL_Delay()>
    <4.d. J'affiche l'écran une fois en plus : SDL_RenderPresent()>

    <etc.>



    Comment puis-je régler le problème "proprement" sur le 2ème ordinateur? Désolé d'avoir été long, mais j'ai essayé d'être clair :-)

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    J'ai pas vraiment idée d'ou vient le probleme sur ce lien pour le double buffering il faut apparemment utiliser SDL_GL_SwapWindow(mainWindow);
    sinon si le probleme vient opengl :essaye pour voir SDL_CreateRenderer(ecran, -1, SDL_RENDERER_SOFTWARE); .

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 158
    Billets dans le blog
    152
    Par défaut
    Bonjour,

    Je suis assez étonné, mais soit.
    Peux t-on voir le code ?
    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.

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2012
    Messages : 2
    Par défaut
    Diantre, j'étais en train de taper un long message pour expliquer mon code... et voila que je pense avoir trouvé le problème (un peu par hasard) en réfléchissant aux diverses questions à vous poser (comme quoi, il est parfois nécessaire de laisser reposer la matière quelques jours, plutôt que de s'acharner) :-)

    A mon avis, je n'utilisais pas les bons paramètres pour créer le renderer. J'avais écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SDL_Renderer *renderer;
    ...
    renderer=SDL_CreateRenderer(fenetre, -1, SDL_RENDERER_ACCELERATED);
    Et je l'ai changé en ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SDL_Renderer *renderer;
    ...
    renderer=SDL_CreateRenderer(fenetre, -1, SDL_RENDERER_SOFTWARE);
    Cependant je ne comprends pas pourquoi le "SDL_RENDERER_ACCELERATED" marche sur certains PC alors que le même projet (je déplace carrément le répertoire du projet que j'ai rendu portable, car il contient les .dll, les .lib et les .h) ne tourne pas sur d'autres ordinateurs. C'est surement du à la carte graphique de m.... sur les PC de l'école :-)

    Le "SDL_RENDERER_ACCELERATED" utiliserait alors un système de double-buffering? Quelqu'un saurait m'expliquer la différence entre "SDL_RENDERER_ACCELERATED" et "SDL_RENDERER_SOFTWARE" car je ne trouve pas beaucoup d'explications claires à ce sujet.

    ...
    ...
    ...

    Re-diantre!! Mais je suis vraiment un âne!!! Kannagi avait donné la solution!!! J'avais tellement fait une overdose de recherches infructueuses que je croyais justement créer mon renderer comme Kannagi le proposait. Ben merci Kannagi, tu avais vu juste :-) J'avais suivi les conseils de wikibooks sans réfléchir.

    Merci beaucoup pour vos réactions rapides ... et surtout correctes :-) Je viendrai vous ennuyer à nouveau si je fais d'autres bêtises :-)

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 158
    Billets dans le blog
    152
    Par défaut
    La différence entre SDL_RENDERER_ACCELERATED et SDL_RENDERER_SOFTWARE c'est que la SDL utilisera deux renderer différents. Un renderer peut être comparé à un pinceau. le pinceau du GPU (ACCELERATED) est plus rapide que celui du CPU (SOFTWARE).
    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.

Discussions similaires

  1. [SFML] Problème double-buffer
    Par black is beautiful dans le forum SFML
    Réponses: 2
    Dernier message: 04/11/2014, 08h39
  2. [double buffer et contrôles] problème de rafraichissement
    Par crakocrako dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/04/2009, 16h16
  3. [MFC] Scinttillement vs Double buffering
    Par DamessS dans le forum MFC
    Réponses: 9
    Dernier message: 07/04/2005, 09h01
  4. Réponses: 7
    Dernier message: 03/08/2004, 16h33
  5. [Exception]Double buffering & NullPointerException
    Par Seiya dans le forum API standards et tierces
    Réponses: 25
    Dernier message: 09/07/2004, 18h41

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