2010-02-08 3 views
6

Je cherche une manière portable de faire un SwapBuffers non bloquant() même si VSync est activé.
En d'autres termes, est-il possible d'être averti par un événement ou de connaître le retard jusqu'au prochain VSync?SwapBuffers non bloquant() avec VSync = sur

+0

Cela va être spécifique à la plate-forme, si c'est possible. Veuillez donc spécifier votre plateforme, en taguant au moins. – unwind

+0

Je voudrais trouver un moyen portable pour implémenter cette fonctionnalité (Win32/Linux/MacOSX) –

+0

comment le délai jusqu'à ce que le prochain vsync vous aide? Ce n'est pas comme si l'appel swapbuffer faisait l'échange au moment de l'appel. – Bahbar

Répondre

0

Premièrement, pourquoi n'appelez-vous pas simplement SwapBuffers() au début de la trame? Ou changer en quelque sorte le pipeline à

Render(); 
    Update(); //Update before swapping buffers 
    SwapBuffers(); 

Alors que OpenGL travaille loin à toutes les commandes que vous venez jetai à, vous pouvez faire tout votre logique de mise à jour.

Sinon, il existe plusieurs façons de résoudre ce problème.

Je sais que XNA a une propriété ScanLine, qui vous indique la ligne de balayage à laquelle l'écran est actuellement actif. Je ne sais pas si OpenGL l'expose aussi, mais je suis sûr qu'il le faut. (Droite?)

Utiliser le rendu multithread. De nombreux moteurs modernes dédient un fil entier juste pour le rendu. Si ça bloque, ça va, ça ne dérange pas le fil principal. Alternallavly un moyen plus simple est de gérer simplement les entrées etc. sur un nouveau thread, cela évite les complications avec les contextes graphiques.

Utilisez triple buffering. L'utilisation de la triple bufférisation signifie que vous avez 2 tampons arrières. Une fois que vous appelez SwapBuffers, l'écran peut continuer à balayer le tampon avant, avec votre tampon nouvellement terminé, et le troisième tampon pour vous permettre de rendre l'image suivante. Bien sûr, si vous avez déjà prérendu deux images, SwapBuffers() bloquera.