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?

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.


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 ().


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.


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.


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.


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ć.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.