2009-07-04 10 views
6

Ho giocato con pygame (su Debian/Lenny). Sembra funzionare bene, tranne che per il fastidioso tearing di blit (modalità a schermo intero o finestra).Come evitare lo strappo con pygame su Linux/X11

Sto utilizzando il driver SDL X11 predefinito. Googling suggerisce che è un problema noto con SDL che X11 non offre alcuna funzione vsync (anche con un display creato con i flag FULLSCREEN|DOUBLEBUF|HWSURFACE) e dovrei usare il driver "dga".

Tuttavia, l'esecuzione

SDL_VIDEODRIVER=dga ./mygame.py 

tiri in pygame inizializzazione con

pygame.error: No available video device 

(nonostante xdpyinfo mostrando un'estensione XFree86-DGA presente).

Quindi: qual è il trucco per ottenere salti senza fine senza lacrime? O facendo funzionare questa cosa dga o qualche altro meccanismo?

+1

Avete il driver del kernel appropriato per la vostra scheda video. Per X11, è necessario sia un driver del kernel che un lib di X11 per accedervi. Se ne manca uno, l'altro funzionerà, ma sarà inutilizzabile. – SingleNegationElimination

+0

Sono un po 'sorpreso da questo come http://packages.debian.org/lenny/libxxf86dga1, che sembra fornire la roba DGA in X11, non menziona nulla sui moduli del kernel (cosa apparirebbe come in lsmod?). Per quello che vale, sto usando il driver nv xorg con una vecchia scheda NVidia AGP serie 5. – timday

risposta

4

Bene, la mia soluzione finale era passare a Pyglet, che sembra supportare OpenGL molto meglio di Pygame e non presenta problemi di sfarfallio.

+1

Pyglet è anche molto più vicino in termini di API e pratica ad altre librerie grafiche per altre lingue e tecnologie moderne. – Jotham

+0

[Gloss] (http://www.tuxradar.com/gloss) è un'altra opzione se non vuoi andare fino in fondo. Apre OpenGL in classi e metodi semplici e funziona bene su Pygame. – fbmd

4

Il modo migliore per ridurre al minimo lo strappo è di mantenere il frame rate il più vicino possibile alla frequenza dello schermo. La libreria SDL non ha un vsync a meno che tu non stia eseguendo OpenGL attraverso di esso, quindi l'unico modo è di approssimare te stesso la frequenza dei fotogrammi. Il doppio buffer dell'hardware SDL non è garantito, sebbene sia piacevole quando funziona. L'ho visto raramente in azione.

Nella mia esperienza con SDL è necessario utilizzare OpenGL per eliminare completamente lo strappo. È un po 'un aggiustamento, ma disegnare semplici trame 2D non è poi così complicato e ottieni alcuni altri bonus aggiuntivi che puoi implementare come rotazione, ridimensionamento, fusione e così via.

Tuttavia, se si desidera utilizzare ancora il rendering del software, si consiglia di utilizzare l'aggiornamento del rettangolo sporco. È anche un po 'difficile abituarsi, ma consente di risparmiare un sacco di elaborazione che potrebbe rendere più facile mantenere gli aggiornamenti al passo ed evita che l'intero schermo si strappi (a meno che non si stia scorrendo l'intera area di gioco o qualcosa del genere). Così come il tempo necessario per disegnare sul buffer è il minimo che può evitare il blitting che si verifica mentre lo schermo si sta aggiornando, che è la causa dello strappo.