Erhöhen Sie die Bildrate von Pygame

10

Wenn ich mein Spiel profiliere, sehe ich, dass der überwiegende Teil der Ausführungszeit meines Hobbyspiels zwischen dem Blit und dem Flip Call liegt. Derzeit läuft es nur mit ca. 13fps. Meine Grafikkarte ist ziemlich anständig, daher schätze ich, dass Pygame sie nicht verwendet.

Kennt jemand irgendwelche Grafik- / Anzeigeoptionen, die ich im Pygame einstellen muss, um dies zu beschleunigen? Oder ist das nur etwas, mit dem ich leben muss, seit ich mich für Pygame entschieden habe?

Smashery
quelle

Antworten:

12

Wenn Sie im Vollbildmodus arbeiten, können Sie das pygame.HWSURFACEFlag verwenden, wenn Sie die Anzeige initialisieren, um Pygame anzuweisen, eine Hardwareoberfläche zu verwenden. Ich glaube, wenn eine Hardware-Oberfläche nicht verwendet werden kann, wird Pygame stillschweigend eine Software-Oberfläche verwenden.

Wenn Sie keine Hardwareoberfläche verwenden, sollten Sie pygame.display.update(rectangle)eher als verwenden pygame.display.flip(). Dadurch wird nur das angegebene Rechteck und nicht die gesamte Anzeige aktualisiert. Dies kann Ihre Leistung erheblich steigern, es sei denn, Ihr Spiel muss tatsächlich die gesamte Anzeige aktualisieren.

Wenn Sie eine Hardware- oder OpenGL-Oberfläche verwenden, gibt es auch eine, pygame.DOUBLEBUFdie Hardware-Doppelpufferung verwendet. Dies bedeutet, dass Ihre Zeichenfunktionen in einen der beiden Puffer zeichnen und flip()den sichtbaren Puffer austauschen.

Talljosh
quelle
5

Ein Engpass im Pygame ist das Rendern von Schriftarten. Sie sollten denselben Text (mit derselben Schriftart / Farbe) nicht mehr als einmal rendern, sondern die gerenderten Oberflächen zwischenspeichern und wiederverwenden. Berücksichtigen Sie dies, wenn Sie häufig Font.render () verwenden.

Faultier
quelle
4

Zusätzlich zu Talljoshs Antwort möchte ich noch ein paar Vorschläge einbringen:

Vermeiden Sie Rotationen und Skalierungen, wo immer Sie können. Solche Operationen werden ausschließlich auf der CPU ausgeführt und sind in der Regel sehr, sehr langsam.

Wenn Sie direkte Pixellesevorgänge / -änderungen vornehmen, verwenden Sie die Surface.get_buffer()Methode und arbeiten Sie damit, anstatt die Surface.set_at()/get_at()Methoden zu verwenden.

Cody Brocious
quelle
2

Kommentieren Sie alle Testkonsolenausgaben aus, die Sie haben. Dies kann die Framerate drastisch reduzieren, insbesondere wenn Sie zwischen Rotation und Skalierung ausgeben, wie Cody oben sagte.

kymully
quelle
2

Es ist richtig, dass Pygame die 3D-Beschleunigungsfunktionen Ihrer Grafikkarte nicht nutzt. Dies liegt daran, dass es auf SDL basiert, das dieselbe Einschränkung aufweist. Eine Alternative ist das Spiel in einem System wie neu zu schreiben Pyglet , die nicht nativen OpenGL unterstützen Sprites beschleunigt, um eine ähnliche Bibliothek für Grafiken zu finden nur, oder den OpenGL - Code selbst dafür zu schreiben.

Kylotan
quelle
Pyglet ist großartig.
Die kommunistische Ente
1

Eine unglaublich einfache Sache ist die Verwendung von Psyco . Ich weiß nicht, wie viel es helfen wird, aber da alles, was es erfordert, ist

 import psyco
 psyco.full()

Um loszulegen, können Sie es auch versuchen.

Nikwin
quelle
Psyco wird mit modernem idiomatischem Python-Code wirklich nicht viel helfen. Verwenden Sie PyPy, wenn Sie eine JIT möchten (nicht sicher, ob PyGame dort funktioniert).
Coderanger
Pygame funktioniert nicht unter PyPy, aber Pyglet macht es, los geht's.
Coderanger