python - mousemotion - pygame volume




Любой способ ускорить Python и Pygame? (4)

Вы можете попробовать использовать Psyco (http://psyco.sourceforge.net/introduction.html). Это часто имеет большое значение.

Я пишу простой верхний вниз по RPG в Pygame, и я обнаружил, что он довольно медленный. Хотя я не ожидал, что python или pygame будут соответствовать FPS игр, сделанных с использованием компилированных языков, таких как C / C ++ или event Byte Compiled такие как Java, но все же текущий FPS pygame похож на 15. Я попробовал рендеринг 16-цветных растровых изображений вместо PNG или 24 растровых изображений, что немного увеличило скорость, а затем в отчаянии я переключил все на черно-белые монохромные растровые изображения и что сделал FPS до 35. Но не больше. Теперь, согласно большинству книг по разработке игр, которые я прочитал, для того, чтобы пользователь был полностью удовлетворен графикой игры, FPS в 2-й игре должен быть как минимум 40, так есть ли способ повысить скорость pygame?


Используйте Psyco для python2:

import psyco
psyco.full()

Кроме того, включите двойное буферизацию. Например:

from pygame.locals import *
flags = FULLSCREEN | DOUBLEBUF
screen = pygame.display.set_mode(resolution, flags, bpp)

Вы также можете отключить альфа, если вам это не нужно:

screen.set_alpha(None)

Вместо того, чтобы каждый раз листать весь экран, отслеживайте измененные области и обновляйте их. Например, что-то примерно такое (основной цикл):

events = pygame.events.get()
for event in events:
    # deal with events
pygame.event.pump()
my_sprites.do_stuff_every_loop()
rects = my_sprites.draw()
activerects = rects + oldrects
activerects = filter(bool, activerects)
pygame.display.update(activerects)
oldrects = rects[:]
for rect in rects:
    screen.blit(bgimg, rect, rect)

Большинство (все?) Функции рисования возвращают прямоугольник.

Вы также можете установить только некоторые разрешенные события, для более быстрой обработки событий:

pygame.event.set_allowed([QUIT, KEYDOWN, KEYUP])

Кроме того, я бы не стал беспокоиться о создании буфера вручную и не использовал бы флаг HWACCEL, поскольку у меня возникли проблемы с ним на некоторых настройках.

Используя это, я добился достаточно хорошей FPS и гладкости для небольшого 2d-платформера.


При загрузке изображений, если вы абсолютно требуете прозрачности или других альфа-значений, используйте метод Surface.convert_alpha (). Я использую его для игры, которую я программировал, и это привело к огромному увеличению производительности. EG: В своем конструкторе загрузите изображения, используя:

self.srcimage = pygame.image.load(imagepath).convert_alpha() 

Насколько я могу судить, любые преобразования, которые вы делаете с изображением, сохраняют производительность, которую вызывает этот метод. НАПРИМЕР:

self.rotatedimage = pygame.transform.rotate(self.srcimage, angle).convert_alpha()

становится излишним, если вы используете изображение, на котором была выполнена convert_alpha() .


При использовании изображений важно преобразовать их с помощью функции convert () изображения. Я прочитал, что convert () отключает альфу, которая обычно довольно медленная. У меня также были проблемы с скоростью, пока я не использовал глубину цвета 16 бит и функцию преобразования для моих изображений. Теперь мой FPS составляет около 150, даже если я блистаю большое изображение на экране.

image = image.convert()#video system has to be initialed

Также для вычисления требуется много времени для вращения и масштабирования. Большое, преобразованное изображение может быть сохранено на другом изображении, если оно является неизменным.

Поэтому идея состоит в том, чтобы рассчитать один раз и повторно использовать результат несколько раз.





frame-rate