Accelera il frame rate di pygame


10

Profilando il mio gioco, vedo che la stragrande maggioranza dei tempi di esecuzione del mio gioco per hobby è tra i blit e le chiamate a fogli mobili. Attualmente, funziona solo a circa 13 fps. La mia scheda video è abbastanza decente, quindi suppongo che Pygame non la stia usando.

Qualcuno sa di eventuali opzioni grafiche / di visualizzazione che devo impostare in pygame per renderlo più veloce? O è solo qualcosa con cui devo convivere da quando ho scelto Pygame?

Risposte:


12

Se stai funzionando in modalità a schermo intero, puoi usare il pygame.HWSURFACEflag quando inizializzi il display per dire a pygame di provare a usare una superficie hardware. Credo che se non è possibile utilizzare una superficie hardware, pygame utilizzerà silenziosamente una superficie software.

Se non si utilizza una superficie hardware, è consigliabile utilizzare pygame.display.update(rectangle)anziché pygame.display.flip(). Questo aggiornerà solo il rettangolo dato anziché l'intero display, il che può aumentare un po 'le tue prestazioni a meno che il tuo gioco non abbia effettivamente bisogno di aggiornare l'intero display.

Se stai usando una superficie hardware o OpenGL, c'è anche il pygame.DOUBLEBUF che utilizza il doppio buffering hardware, il che significa che le tue funzioni di disegno attireranno uno dei due buffer e flip()scambieranno quale buffer è visibile.


5

Un collo di bottiglia in Pygame è in realtà il rendering dei caratteri. Non dovresti eseguire il rendering dello stesso testo (con lo stesso carattere / colore) più di una volta, ma piuttosto memorizzare nella cache le superfici una volta renderizzate e riutilizzarle. Prendi questo in conto se stai usando Font.render () molto.


4

Oltre alla risposta di talljosh, vorrei aggiungere alcuni altri suggerimenti:

Evita rotazioni e ridimensionamenti laddove possibile. Tali operazioni vengono eseguite esclusivamente sulla CPU e tendono ad essere molto, molto lente.

Se stai eseguendo letture / modifiche di pixel dirette, usa il Surface.get_buffer()metodo e lavora con quello, piuttosto che usare i Surface.set_at()/get_at()metodi.


2

Commenta qualsiasi output della console di test che hai. Questo può ridurre drasticamente il framerate, specialmente se si sta producendo tra rotazione e ridimensionamento, come ha detto Cody sopra.


2

È corretto che Pygame non utilizzi le funzionalità di accelerazione 3D della scheda video. Questo perché si basa su SDL che presenta le stesse limitazioni. Un'alternativa è riscrivere il gioco in un sistema come pyglet che non supporta nativamente OpenGL accelerato sprite, per trovare una libreria simile solo per la grafica, o scrivere il codice OpenGL te stesso per questo.


Pyglet è fantastico.
Il comunista Duck il

1

Una cosa incredibilmente semplice da fare è usare psyco . Non so quanto possa aiutare, ma poiché tutto ciò che serve è

 import psyco
 psyco.full()

per iniziare a correre, puoi anche provarlo.


Psyco non aiuterà molto con il moderno codice Python idiomatico. Usa PyPy se vuoi un JIT (non sono sicuro che PyGame funzioni lì).
coderanger

Pygame non funziona con PyPy, ma Pyglet lo fa così.
coderanger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.