Synchronisation de plusieurs fenêtres OpenGL avec vsync

Dans une application Windows, plusieurs fenêtres OpenGL sont ouvertes simultanément. Idéalement, je voudrais que chacun d’eux dessine à 60 ips, synchronisé avec le rafraîchissement de l’écran.

Pour chaque contexte de rendu, j’appelle wglSwapIntervalEXT(1) pour activer vsync. Chaque fenêtre a son propre thread d’affichage, qui dessine le cadre, puis appelle SwapBuffers pour mettre à jour.

Il se trouve que les fenêtres se “combattent”: il semblerait que les appels SwapBuffers soient synchronisés et attendent l’un l’autre, même s’ils se trouvent dans des threads distincts. Je mesure le temps image par image de chaque fenêtre et avec deux fenêtres, cela passe à 30 images par seconde, avec trois à 20 images par seconde, etc.

Si je désactive vsync avec wglSwapIntervalEXT(0) , elles se rafraîchissent à 60 images par seconde, quel que soit le nombre de fenêtres que j’ouvre. Mais avec une fenêtre ouverte, ce n’est pas aussi lisse qu’avec vsync activé.

Est-il possible d’accomplir ce que je veux avec OpenGL?

Sous Linux, beaucoup de comportements étranges sont apparus dans mes applications en raison de l’appel de fonctions vidéo provenant de différents threads.

J’ai résolu ces problèmes en utilisant un seul thread pour l’affichage depuis le début de l’application, créer une fenêtre, créer un glcontext, etc., et utiliser des sémaphores et des files d’attente pour partager des données entre ce thread et les autres.

Vous pouvez peut-être obtenir le périphérique de sortie et utiliser la fonction WaitForVBlank dans une boucle à partir d’un thread. Cela peut ensuite poster des messages ou signaler des événements pour chaque fenêtre qui vous intéresse.