2009-08-02 3 views
2

Je travaille actuellement sur un moteur de jeu écrit en pygame et je voulais ajouter le support OpenGL.PyOpenGL + Pygame plafonné à 60 FPS en plein écran

J'ai écrit un test pour voir comment faire fonctionner ensemble pygame et OpenGL, et quand il fonctionne en mode fenêtré, il fonctionne entre 150 et 200 fps. Quand je l'exécute en plein écran (tout ce que j'ai fait était d'ajouter le drapeau FULLSCREEN quand j'ai configuré la fenêtre), il tombe à 60 fps. J'ai ajouté beaucoup plus de fonctions de dessin pour voir si c'était juste une énorme baisse de performance, mais ça tournait toujours à 60 fps.

Y a-t-il quelque chose de supplémentaire que je dois faire pour dire à OpenGL qu'il fonctionne en plein écran ou est-ce une limitation d'OpenGL?

(je suis en cours d'exécution dans Windows XP)

+0

Sur quel système travaillez-vous (windows, linux/X11, etc.)? –

Répondre

7

Comme nous l'avons souligné, cela serait dû au fait que Pygame attend le retour vertical lorsque vous mettez à jour l'écran en appelant display.flip(). Comme le note Pygame display documentation, si vous définissez le mode d'affichage à l'aide des indicateurs HWSURFACE ou DOUBLEBUF, display.flip() attendra la retrace verticale avant de permuter les tampons.

Pour être honnête, je ne vois aucune bonne raison (en dehors de l'analyse comparative) pour essayer d'atteindre une fréquence d'image plus rapide que la fréquence de rafraîchissement de l'écran. Vous (et les personnes jouant à votre jeu) ne serez pas en mesure de remarquer une différence de vitesse ou de performance, puisque l'affichage ne peut tirer que 60 fps de toute façon. De plus, si vous ne synchronisez pas avec le retrace vertical, il y a de bonnes chances que vous obteniez screen tearing.

1

Est-ce un problème V-Sync? Quelque chose à propos de la configuration ou de votre environnement peut limiter la fréquence d'images maximale à la fréquence de rafraîchissement de votre moniteur.

0

Si vous ne modifiez pas votre clock.tick() lorsque vous passez du mode plein écran au mode fenêtré, il s'agit presque certainement d'un problème de type vsync. Si vous êtes sur un écran LCD, c'est sûr à 100%.

Malheureusement, v-sync peut être géré dans de nombreux endroits, y compris SDL, Pyopengl, votre serveur d'affichage et vos pilotes vidéo. Si vous utilisez Windows, vous pouvez ajuster la bascule vsync dans le panneau de configuration nvidia pour tester, et il y a plus que probablement quelque chose dans nvidia-settings pour Linux. Je suppose que les pilotes d'autres fabricants ont des paramètres similaires, mais c'est une supposition.

+0

Que voulez-vous dire par "changin clock.tickf()?" J'utilise aussi la carte graphique fournie avec l'ordinateur, donc je ne pense pas pouvoir accéder aux paramètres de vsync. Est-ce que je peux faire ça avec OpenGL? –

+0

clock.tick() est un mécanisme de pygames pour contrôler la fréquence des retraits d'écran. http://www.pygame.org/docs/ref/time.html est le doc, et voici l'exemple et l'utiliser http://www.pygame.org/docs/tut/chimp/ChimpLineByLine.html. – Pmc

+0

@htw S'il s'agissait d'un problème d'implémentation de pygame, les résultats ne seraient-ils pas uniformes quel que soit l'état FULLSCREEN? – Pmc