2009-07-04 27 views
6

He estado jugando con pygame (en Debian/Lenny). Parece que funciona bien, excepto por el molesto rasgado de blits (pantalla completa o modo de ventana).Cómo evitar el desgarro con pygame en Linux/X11

Estoy usando el controlador predeterminado de SDL X11. Google sugiere que es un problema conocido con SDL que X11 no ofrece ninguna función vsync (incluso con una pantalla creada con flags FULLSCREEN|DOUBLEBUF|HWSURFACE), y yo debería usar el controlador "dga" en su lugar.

Sin embargo, ejecutar

SDL_VIDEODRIVER=dga ./mygame.py 

lanza en la inicialización pygame con

pygame.error: No available video device 

(a pesar de xdpyinfo que muestra una extensión XFree86-DGA presente).

Entonces, ¿cuál es el truco para obtener flips vsynced sin rasgaduras? ¿Al hacer funcionar esta dga o algún otro mecanismo?

+1

Tiene el controlador kernel apropiado para su tarjeta de video. Para X11, necesita un controlador de kernel y una lib de X11 para acceder a él. Si falta uno, el otro funcionará, pero será inutilizable. – SingleNegationElimination

+0

Estoy un poco sorprendido por esto, ya que http://packages.debian.org/lenny/libxxf86dga1, que parece proporcionar el material DGA en X11, no menciona nada sobre los módulos kernel (¿cómo se mostraría? lsmod?). Por lo que vale, estoy usando el controlador nv xorg con una vieja tarjeta NVidia AGP de 5 series. – timday

Respuesta

4

Bueno, mi solución final fue cambiar a Pyglet, que parece soportar OpenGL mucho mejor que Pygame, y no tiene ningún problema de parpadeo.

+1

Pyglet también está mucho más cerca en términos de API y practica con otras bibliotecas de gráficos para otros lenguajes y tecnologías modernas. – Jotham

+0

[Brillo] (http://www.tuxradar.com/gloss) es otra opción si no desea recorrer todo el camino. Cubre OpenGL en clases y métodos fáciles, y juega muy bien a lo largo de Pygame. – fbmd

4

La mejor manera de mantener el rasgado al mínimo es mantener su velocidad de cuadro lo más cerca posible de la pantalla. La biblioteca SDL no tiene una función vsync a menos que esté ejecutando OpenGL a través de ella, por lo que la única forma es aproximar la velocidad de fotogramas usted mismo. El doble buffer de hardware SDL no está garantizado, aunque es bueno cuando funciona. Pocas veces lo he visto en acción.

En mi experiencia con SDL, tiene que usar OpenGL para eliminar por completo la rotura. Es un poco un ajuste, pero dibujar texturas 2D simples no es tan complicado y obtienes algunas otras bonificaciones adicionales que puedes implementar como rotación, escalado, fusión, etc.

Sin embargo, si aún desea utilizar la representación del software, le recomiendo que use la actualización de rectángulo sucio. También es un poco difícil acostumbrarse, pero ahorra un montón de procesamiento que puede hacer que sea más fácil mantener las actualizaciones al ritmo y evita que toda la pantalla se rompa (a menos que estés desplazando toda el área de juego o algo así). Además, el tiempo que lleva dibujar en el búfer es mínimo, lo que puede evitar que ocurra el blitting mientras la pantalla se está actualizando, lo cual es la causa del desgarro.