2009-07-04 3 views
6

Ich habe mit Pygame (auf Debian/Lenny) gespielt. Es scheint gut zu funktionieren, außer für das lästige Reißen von Blits (Vollbild oder Fenstermodus).Wie man das Zerreißen mit pygame unter Linux/X11 vermeidet

Ich verwende den Standard SDL X11-Treiber. Googling deutet darauf hin, dass es ein bekanntes Problem mit SDL ist, dass X11 keine Vsync-Funktion bietet (selbst mit einer Anzeige, die mit FULLSCREEN|DOUBLEBUF|HWSURFACE Flags erstellt wurde), und ich stattdessen den "dga" -Treiber verwenden sollte.

jedoch

SDL_VIDEODRIVER=dga ./mygame.py 

wirft in pygame Initialisierung mit

pygame.error: No available video device 

(trotz xdpyinfo zeigt ein XFree86-DGA-Erweiterung vorhanden ist) ausgeführt wird.

Also: Was ist der Trick, um reissfreie Vsync-Flips zu bekommen? Entweder, indem du diese DGA-Sache funktionst oder irgendeinen anderen Mechanismus?

+1

Haben Sie den entsprechenden Kernel-Treiber für Ihre Grafikkarte? Für X11 benötigen Sie sowohl einen Kernel-Treiber als auch eine X11-Lib, um darauf zugreifen zu können. Wenn einer fehlt, funktioniert der andere, ist aber unbrauchbar. – SingleNegationElimination

+0

Ich bin ein wenig überrascht von dieser als http://packages.debian.org/lenny/libxxf86dga1, die den DGA-Stuff in X11 zu liefern scheint, erwähnt nichts über Kernel-Module (was würde es zeigen wie in lsmod?). Für das, was es wert ist, verwende ich den nv xorg Treiber mit einer alten 5-series AGP NVidia Karte. – timday

Antwort

4

Nun meine mögliche Lösung war, auf Pyglet, die OpenGL viel besser als Pygame zu unterstützen scheint, und hat keine Flimmerprobleme.

+1

Pyglet ist auch in Bezug auf API und Praxis viel näher an anderen Grafikbibliotheken für andere Sprachen und moderne Technologien. – Jotham

+0

[Gloss] (http://www.tuxradar.com/gloss) ist eine weitere Option, wenn Sie nicht den ganzen Weg gehen wollen. Es umschließt OpenGL in einfachen Klassen und Methoden und spielt gut mit Pygame. – fbmd

4

Der beste Weg, um das Tearing auf ein Minimum zu beschränken, besteht darin, die Bildrate so nah wie möglich an der Bildschirmfrequenz zu halten. Die SDL-Bibliothek hat keinen vsync, es sei denn, Sie führen OpenGL durch, so dass Sie die Bildrate nur selbst bestimmen können. Der SDL-Hardware-Doppelpuffer ist nicht garantiert, obwohl es gut funktioniert. Ich habe es selten in Aktion gesehen.

Nach meiner Erfahrung mit SDL müssen Sie OpenGL verwenden, um Tearing vollständig zu beseitigen. Es ist ein bisschen Anpassung, aber das Zeichnen einfacher 2D-Texturen ist nicht so kompliziert und Sie erhalten ein paar zusätzliche Boni, die Sie implementieren können, wie Drehen, Skalieren, Überblenden und so weiter.

Wenn Sie jedoch immer noch das Software-Rendering verwenden möchten, empfehle ich die Aktualisierung des Dirty-Rechtecks. Es ist auch ein bisschen schwierig, sich daran zu gewöhnen, aber es spart viel Verarbeitung, was es einfacher macht, die Updates auf Tempo zu halten und es vermeidet, den ganzen Bildschirm zu zerreißen (außer man scrollt den ganzen Spielbereich oder etwas). Ebenso wie die Zeit, die benötigt wird, um in den Puffer zu zeichnen, ist ein Minimum, das das Blitting vermeiden kann, das stattfindet, während der Bildschirm aktualisiert wird, was die Ursache des Reißens ist.