Zwiększ szybkość klatek pygame

10

Profilując moją grę, widzę, że zdecydowana większość czasu wykonywania mojej gry hobby to między rozmowami typu blit a flip. Obecnie działa tylko przy około 13 klatkach na sekundę. Moja karta graficzna jest całkiem przyzwoita, więc domyślam się, że pygame jej nie używa.

Czy ktoś zna jakieś opcje grafiki / wyświetlania, które muszę ustawić w pygame, aby przyspieszyć? A może to tylko coś, z czym muszę żyć, odkąd wybrałem pygame?

Smashery
źródło

Odpowiedzi:

12

Jeśli pracujesz w trybie pełnoekranowym, możesz użyć pygame.HWSURFACEflagi podczas inicjalizacji wyświetlacza, aby powiedzieć pygame, aby spróbowała użyć powierzchni sprzętowej. Wierzę, że jeśli nie można użyć powierzchni sprzętowej, pygame po cichu użyje powierzchni programowej.

Jeśli nie używasz powierzchni sprzętowej, rozważ użycie pygame.display.update(rectangle)zamiast pygame.display.flip(). Spowoduje to jedynie zaktualizowanie danego prostokąta, a nie całego ekranu, co może znacznie zwiększyć wydajność, chyba że gra faktycznie wymaga aktualizacji całego ekranu.

Jeśli korzystasz z powierzchni sprzętowej lub OpenGL, istnieje również funkcja pygame.DOUBLEBUFpodwójnego buforowania sprzętowego, co oznacza, że ​​funkcje rysowania będą rysować w jednym z dwóch buforów i flip()zamieniać, który bufor jest widoczny.

Talljosh
źródło
5

Jednym wąskim gardłem w grze pygame jest renderowanie czcionek. Nie należy renderować tego samego tekstu (tą samą czcionką / kolorem) więcej niż jeden raz, ale raczej buforować powierzchnie po renderowaniu i ponownie ich użyć. Weź to pod uwagę, jeśli używasz dużo Font.render ().

Leniwiec
źródło
4

Oprócz odpowiedzi Talljosha, chciałbym dodać jeszcze kilka sugestii:

Unikaj rotacji i skalowania, gdziekolwiek możesz. Takie operacje są wykonywane wyłącznie na procesorze i zwykle przebiegają bardzo, bardzo wolno.

Jeśli wykonujesz bezpośrednie odczyty / modyfikacje pikseli, użyj Surface.get_buffer()metody i pracuj z nią, zamiast z Surface.set_at()/get_at()metod.

Cody Brocious
źródło
2

Skomentuj posiadane dane wyjściowe konsoli testowej. Może to drastycznie zmniejszyć liczbę klatek na sekundę, szczególnie jeśli przesyłasz dane między obrotem a skalowaniem, jak powiedział Cody powyżej.

kymully
źródło
2

To prawda, że ​​Pygame nie wykorzystuje możliwości akceleracji 3D karty graficznej. Jest tak, ponieważ jest oparty na SDL, który ma takie same ograniczenia. Jedną z alternatyw jest przepisać swoją grę w systemie jak pyglet który ma natywnie obsługuje OpenGL ikonek, aby znaleźć podobne bibliotekę tylko grafikę, lub napisać kod samodzielnie OpenGL dla tego produktu.

Kylotan
źródło
Pyglet jest świetny.
Kaczka komunistyczna
1

Jedną z niewiarygodnie prostych rzeczy jest użycie psyco . Nie wiem, ile to pomoże, ale skoro wszystko to wymaga

 import psyco
 psyco.full()

aby zacząć biegać, możesz spróbować.

Nikwin
źródło
Psyco naprawdę niewiele pomoże w nowoczesnym idiomatycznym kodzie Python. Użyj PyPy, jeśli chcesz JIT (nie jestem pewien, czy PyGame tam działa).
coderanger
Pygame nie działa pod PyPy, ale Pyglet robi to, proszę bardzo.
coderanger