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.