Haga que la velocidad de fotogramas de pygame sea más rápida

10

Al perfilar mi juego, veo que la gran mayoría del tiempo de ejecución de mi juego de pasatiempo es entre el blit y el flip call. Actualmente, solo funciona a alrededor de 13 fps. Mi tarjeta de video es bastante decente, así que supongo que pygame no la está usando.

¿Alguien sabe de las opciones de gráficos / visualización que necesito configurar en pygame para hacer esto más rápido? ¿O es algo con lo que tengo que vivir desde que elegí Pygame?

Smashery
fuente

Respuestas:

12

Si está ejecutando en modo de pantalla completa, puede usar la pygame.HWSURFACEbandera cuando inicializa la pantalla para indicarle a pygame que intente usar una superficie de hardware. Creo que si no se puede usar una superficie de hardware, pygame usará silenciosamente una superficie de software.

Si no está utilizando una superficie de hardware, considere usar en pygame.display.update(rectangle)lugar de pygame.display.flip(). Esto solo actualizará el rectángulo dado en lugar de la pantalla completa, lo que puede aumentar su rendimiento bastante a menos que su juego realmente necesite actualizar toda la pantalla.

Si está utilizando una superficie de hardware o OpenGL, también existe la pygame.DOUBLEBUFque utiliza doble almacenamiento intermedio de hardware, lo que significa que sus funciones de dibujo atraerán a una de las dos memorias intermedias e flip()intercambiarán qué memoria intermedia es visible.

talljosh
fuente
5

Un cuello de botella en pygame es en realidad la representación de fuentes. No debe renderizar el mismo texto (con la misma fuente / color) más de una vez, sino almacenar en caché las superficies una vez renderizadas y reutilizarlas. Tenga esto en cuenta si está utilizando Font.render () mucho.

perezoso
fuente
4

Además de la respuesta de talljosh, me gustaría agregar algunas sugerencias más:

Evite rotaciones y escalas donde sea posible. Dichas operaciones se realizan exclusivamente en la CPU y tienden a ser muy, muy lentas.

Si está haciendo lecturas / modificaciones directas de píxeles, use el Surface.get_buffer()método y trabaje con eso, en lugar de usar los Surface.set_at()/get_at()métodos.

Cody Brocious
fuente
2

Comente cualquier salida de consola de prueba que tenga. Esto puede reducir drásticamente la velocidad de fotogramas, especialmente si está produciendo entre rotación y escala, como dijo Cody anteriormente.

kymully
fuente
2

Es correcto que Pygame no use las capacidades de aceleración 3D de su tarjeta de video. Esto se debe a que se basa en SDL que tiene la misma limitación. Una alternativa es volver a escribir su juego en un sistema como Pyglet el que no admite de forma nativa OpenGL acelerado sprites, para encontrar una biblioteca similar para sólo gráficos, o para escribir el código OpenGL para este.

Kylotan
fuente
Pyglet es genial.
El pato comunista
1

Una cosa increíblemente simple que hacer es usar psyco . No sé cuánto ayudará, pero como todo lo que requiere es

 import psyco
 psyco.full()

para comenzar a correr, también puedes intentarlo.

Nikwin
fuente
Psyco realmente no ayudará mucho con el código idiomático moderno de Python. Use PyPy si desea un JIT (aunque no estoy seguro si PyGame funciona allí).
coderanger
Pygame no funciona en PyPy, pero Pyglet lo hace allí.
coderanger