Используйте 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-платформера.