Pygame ist wohl die erste Anlaufstelle, wenn man in Eigenregie Spiele mit Python programmieren will. Es hat nur einen großen Nachteil: Performance. Warum ich also nach vierzehn Tagen zu Pyglet gewechselt habe.

Pygame

Seit wenigen Wochen spiele ich nun mit Python als Programmiersprache für ein kleines 2D-Computerspiel herum. Nach einigem Herumüberlegen und Nachfragen entschied ich mich, die Engine selbst zu programmieren, nicht zuletzt um meine Programmierskills wieder aufzufrischen. Stehen erstmal die Schlüsselbegriffe „Python“ und „Game“ fest, kommt man fast schon automatisch zu Pygame.

Das Framework bietet eigentlich auch alles, was man für den schnellen Einstieg braucht: Grafik, Sound, Musik und so einiges mehr, sogar verschiedene Routinen zur Kollisionserkennung. Nach kurzer Zeit (gemessen an meinen Ausgangsfähigkeiten) konnte ich mir schon meine erste scrollbare Tilemap auf dem Bildschirm anschauen. Dann die Ernüchterung: 30 FPS im Vollbild. Ohne Spielerfigur, ohne Gegner, ohne KI, ohne alles. Nur die Map. Okay, der PC hat schon ein paar Jahre auf dem Buckel. Aber das?

Man macht sich also zuerst auf die Suche, das Problem zu lösen. Es finden sich durchaus auch einige Strategien dazu:

Dirty Rectangles Screen Update

Wird in vielen Forum empfohlen. Dabei wird in jedem Frame nicht der komplette Bildschirm neu gezeichnet, sondern nur die Bildauschnitte, in denen sich etwas verändert hat. Kann man natürlich machen. Nur soll mein Spiel auf dem Wasser spielen. Wasser bewegt sich immer. Für mich also keine Option.

Geringere Auflösung

Man muss das Spiel natürlich nicht im Vollbild bei 1280×800 oder noch höher laufen lassen. Auf 800×600 wird’s schon schneller. 40 FPS. Dafür sorgen die vergrößerten Pixel für einen schönen 90er Flair. Will ich das? Nö.

Hardwarebeschleunigung

Da ging es mir genauso, wie im Pygame Newbie-Guide beschrieben:

If you’ve been looking at the various flags you can use with pygame.display.set_mode(), you may have thought like this: „Hey, HWSURFACE! Well, I want that – who doesn’t like hardware acceleration. Ooo… DOUBLEBUF; well, that sounds fast, I guess I want that too!“.

Um dann gleich darauf hingewiesen zu werden:

Hardware surfaces are more trouble than they’re worth.

Und tatsächlich. Unter Ubuntu hab ich sie nicht zum Laufen gebracht.

Pyglet

Vor die Wahl gestellt, meine Ansprüche an die Grafik entweder drastisch herunterzuschrauben oder mich anderweitig umzuschauen, bin ich nach einigem Suchen auf Pyglet gestoßen. (Zwischenzeitlich war ich sogar versucht, Cairo zu testen. Aber bis auf ein einzelnes Posting in irgendeinem Forum hab ich nichts zu Cairo als Basis für eine Gameengine gefunden. Wenn jemand mehr dazu weiß, bitte ich um eine kurze Mitteilung oder einen Kommentar.)

Pyglet ist etwas weniger umfangreich als Pygame. Im Grunde stellt es einen einfach zu verwendenden OpenGL-Wrapper dar Aber auch Maus- und Tastaturabfragen können leicht eingebunden werden und auch für Sound und Musik muss man nicht auf andere Frameworks zurückgreifen.

Die hardwarebeschleunigte Grafikausgabe klappte bei mir auf Anhieb. Nachdem ich meinen Code auf Pyglet angepasst hatte, waren die FPS im dreistelligen Bereich. Mission erfolgreich!

Pyglet unterscheidet sich in der Verwendung allerdings in einigen Punkten von Pygame, auf die man achten sollte, will man von der vollen Performancesteigerung profitieren:

Events

In Pygame habe ich einen Loop geschrieben, in dem alles wichtige ablief, was bei jedem Frame aktualisiert werden sollte. Pyglet verwendet stattdessen Events. So wird das Neuzeichnen des Bildschirms zum Beispiel beim Event on_draw ausgeführt. Pyglet entscheidet selbst, wann das sein soll. So geht die Framerate auch mal runter, wenn es nichts neu zu zeichnen gibt.

Batches

In Pyglet lassen sich Sprites in Batches zusammenfassen, die dann schneller gezeichnet werden können. Damit man die Kontrolle behält, was über was gezeichnet wird, kann man Sprites in Gruppen zusammenfassen, die dann in festgelegter Reihenfolge auf den Bildschirm kommen.

Soweit für’s erste mit meinen Pyglet-Erfahrungen. Ob und wie sich mein kleines Spieleprogrammierungsexperiment weiterentwickelt, kann man sicher bald hier lesen.

Update: Inzwischen habe ich auch erste Screenshots von meinem Projekt veröffentlicht.