Швидше зробіть частоту кадрів піґами


10

Профілюючи свою гру, я бачу, що переважна більшість часу виконання моєї хобі-гри проходить між блиском та фліп-дзвінками. Наразі він працює лише зі швидкістю 13 кадрів в секунду. Моя відеокарта досить пристойна, тому я здогадуюсь, що пігама не використовує її.

Хтось знає про будь-які параметри графіки / відображення, які мені потрібно встановити в pygame, щоб зробити це швидше? Або це просто щось, з чим мені доводиться жити, оскільки я вибрав пігаму?

Відповіді:


12

Якщо ви працюєте в повноекранному режимі, ви можете використовувати pygame.HWSURFACEпрапор під час ініціалізації дисплея, щоб повідомити пігмаму про спробу використання апаратної поверхні. Я вважаю, що якщо апаратну поверхню не вдасться використати, pygame мовчки використовуватиме програмну поверхню.

Якщо ви не використовуєте апаратну поверхню, pygame.display.update(rectangle)скоріше скоріше використовуйте pygame.display.flip(). Це лише оновить заданий прямокутник, а не весь дисплей, що може трохи збільшити вашу ефективність, якщо вашій грі фактично не потрібно оновити весь дисплей.

Якщо ви використовуєте апаратну або OpenGL поверхню, там також pygame.DOUBLEBUFвикористовується апаратне подвійне буферизація, тобто ваші функції малювання підтягуються до одного з двох буферів і flip()змінюються тим, який буфер видно.


5

Одне вузьке місце в пігамі - це насправді візуалізація шрифту. Ви не повинні відображати один і той же текст (з одним і тим же шрифтом / кольором) не один раз, а скоріше кешувати поверхні, щойно виведені, і використовувати їх повторно. Враховуйте це, якщо ви багато використовуєте Font.render ().


4

На додаток до відповіді таллйоша, я хотів би запропонувати ще кілька пропозицій:

Уникайте поворотів і масштабування, де тільки можливо. Такі операції робляться виключно на процесорі і, як правило, дуже-дуже повільно.

Якщо ви робите читання / модифікацію прямого пікселя, використовуйте Surface.get_buffer()метод та працюйте з ним, а не з Surface.set_at()/get_at()методами.


2

Прокоментуйте будь-який вихід тестової консолі. Це може різко зменшити частоту кадрів, особливо якщо ви здійснюєте між обертанням і масштабуванням, як Коді сказав вище.


2

Правильно, що Pygame не використовує можливості 3D-прискорення вашої відеокарти. Це відбувається тому, що вона базується на SDL, який має однакові обмеження. Одна альтернативи переписати свою гру в такій системі pyglet , яка має вбудовану підтримку OpenGL прискорився спрайт, щоб знайти подібну бібліотеку тільки графіки, або писати код OpenGL самостійно для цього.


Піглет чудовий.
Качка комуністична

1

Одне неймовірно просте, що потрібно зробити, - це використовувати психіку . Я не знаю, наскільки це допоможе, але оскільки все, що потрібно, це

 import psyco
 psyco.full()

щоб почати біг, ви також можете спробувати.


Psyco справді не дуже допоможе з сучасним ідіоматичним кодом Python. Використовуйте PyPy, якщо ви хочете JIT (не впевнений, чи PyGame там працює).
кодерангер

Pygame не працює під PyPy, але Pyglet робить це там.
кодеранж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.