Accélérez la fréquence d'images de Pygame

10

En profilant mon jeu, je vois que la grande majorité du temps d'exécution de mon jeu de passe-temps se situe entre le blit et les flip calls. Actuellement, il ne fonctionne qu'à environ 13 images par seconde. Ma carte vidéo est assez décente, donc je suppose que Pygame ne l'utilise pas.

Quelqu'un connaît-il des options graphiques / d'affichage que je dois définir dans pygame pour accélérer cela? Ou est-ce juste quelque chose avec lequel je dois vivre depuis que j'ai choisi pygame?

Smashery
la source

Réponses:

12

Si vous exécutez en mode plein écran, vous pouvez utiliser l' pygame.HWSURFACEindicateur lorsque vous initialisez l'affichage pour dire à pygame d'essayer d'utiliser une surface matérielle. Je crois que si une surface matérielle ne peut pas être utilisée, pygame utilisera silencieusement une surface logicielle.

Si vous n'utilisez pas de surface matérielle, envisagez d'utiliser pygame.display.update(rectangle)plutôt que pygame.display.flip(). Cela ne mettra à jour que le rectangle donné plutôt que l'ensemble de l'affichage, ce qui peut augmenter considérablement vos performances, sauf si votre jeu doit réellement mettre à jour l'ensemble de l'affichage.

Si vous utilisez une surface matérielle ou OpenGL, il y a aussi celle pygame.DOUBLEBUFqui utilise une double mémoire tampon matérielle, ce qui signifie que vos fonctions de dessin dessineront sur l'un des deux tampons et flip()échangeront la mémoire tampon visible.

talljosh
la source
5

Un goulot d'étranglement dans Pygame est en fait le rendu des polices. Vous ne devez pas rendre le même texte (avec la même police / couleur) plus d'une fois, mais plutôt mettre en cache les surfaces une fois rendues et les réutiliser. Prenez cela en compte si vous utilisez beaucoup Font.render ().

la paresse
la source
4

En plus de la réponse de talljosh, j'aimerais ajouter quelques suggestions:

Évitez les rotations et la mise à l'échelle partout où vous le pouvez. De telles opérations sont effectuées uniquement sur le CPU et ont tendance à être très, très lentes.

Si vous effectuez des lectures / modifications de pixels directs, utilisez la Surface.get_buffer()méthode et travaillez avec cela, plutôt que d'utiliser les Surface.set_at()/get_at()méthodes.

Cody Brocious
la source
2

Commentez toute sortie de console de test que vous avez. Cela peut réduire considérablement le framerate, surtout si vous effectuez une sortie entre la rotation et la mise à l'échelle, comme l'a dit Cody ci-dessus.

kymully
la source
2

Il est vrai que Pygame n'utilise pas les capacités d'accélération 3D de votre carte vidéo. C'est parce qu'il est basé sur SDL qui a la même limitation. Une alternative consiste à réécrire votre jeu dans un système comme pyglet qui prend en charge nativement les sprites accélérés OpenGL, à trouver une bibliothèque similaire pour les graphiques uniquement, ou à écrire le code OpenGL vous-même pour cela.

Kylotan
la source
Pyglet est super.
The Communist Duck
1

Une chose incroyablement simple à faire est d'utiliser psyco . Je ne sais pas combien cela va aider, mais comme tout ce qu'il faut c'est

 import psyco
 psyco.full()

pour commencer à courir, vous pouvez aussi bien essayer.

Nikwin
la source
Psyco n'aidera vraiment pas beaucoup avec le code Python idiomatique moderne. Utilisez PyPy si vous voulez un JIT (vous ne savez pas si PyGame y fonctionne cependant).
coderanger
Pygame ne fonctionne pas sous PyPy, mais Pyglet le fait là où vous allez.
coderanger