Увеличьте частоту кадров у Pygame

10

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

Кто-нибудь знает какие-либо параметры графики / отображения, которые мне нужно установить в Pygame, чтобы сделать это быстрее? Или это просто то, с чем мне приходится жить с тех пор, как я выбрал pygame?

Smashery
источник

Ответы:

12

Если вы работаете в полноэкранном режиме, вы можете использовать pygame.HWSURFACEфлаг при инициализации дисплея, чтобы сообщить Pygame о попытке использовать аппаратную поверхность. Я считаю, что если аппаратная поверхность не может быть использована, Pygame будет молча использовать программную поверхность.

Если вы не используете аппаратную поверхность, рассмотрите возможность использования pygame.display.update(rectangle)вместо pygame.display.flip(). Это обновит только данный прямоугольник, а не весь экран, что может немного повысить вашу производительность, если вашей игре на самом деле не нужно обновить весь экран.

Если вы используете аппаратную поверхность или поверхность OpenGL, есть также pygame.DOUBLEBUFаппаратная двойная буферизация, что означает, что ваши функции рисования будут отрисовывать один из двух буферов и flip()менять местами какой буфер виден.

talljosh
источник
5

Одним из узких мест в Pygame является рендеринг шрифтов. Вы не должны отображать один и тот же текст (с одним и тем же шрифтом / цветом) более одного раза, а должны кэшировать поверхности после визуализации и использовать их повторно. Примите это во внимание, если вы используете Font.render () много.

леность
источник
4

В дополнение к ответу Таллёша я хотел бы добавить еще несколько предложений:

Избегайте поворотов и масштабирования везде, где возможно. Такие операции выполняются исключительно на процессоре и имеют тенденцию быть очень, очень медленными.

Если вы выполняете прямое считывание / изменение пикселей, используйте Surface.get_buffer()метод и работайте с ним, а не с Surface.set_at()/get_at()методами.

Коди Броусиус
источник
2

Закомментируйте любой вывод тестовой консоли. Это может значительно снизить частоту кадров, особенно если вы выводите данные между вращением и масштабированием, как сказал Коди выше.

kymully
источник
2

Это верно, что Pygame не использует возможности 3D-ускорения вашей видеокарты. Это потому, что он основан на SDL, который имеет то же ограничение. Одна альтернативы переписать свою игру в такой системе pyglet , которая имеет встроенную поддержку OpenGL ускорился спрайты, чтобы найти подобную библиотеку только графики, или писать код OpenGL самостоятельно для этого.

Kylotan
источник
Пиглет великолепен.
Коммунистическая утка
1

Одна невероятно простая вещь - это использовать psyco . Я не знаю, насколько это поможет, но так как все это требует

 import psyco
 psyco.full()

чтобы начать бег, вы можете попробовать.

Nikwin
источник
Psyco действительно мало поможет с современным идиоматическим кодом Python. Используйте PyPy, если вы хотите JIT (хотя не уверен, что PyGame там работает).
Coderanger
Pygame не работает под PyPy, но Pyglet делает так, что вы идете.
Coderanger