有什么方法可以加速Python和Pygame?

时间:2011-06-18 12:15:23

标签: python performance pygame frame-rate

我在Pygame中写了一个简单的自上而下的RPG,我发现它很慢......虽然我不希望python或pygame与用C / C ++等编译语言制作的游戏的FPS相匹配事件Byte编译的像Java,但仍然当前的pygame的FPS就像15.我尝试渲染16色Bitmaps而不是PNG或24位图,这略微提高了速度,然后在绝望中,我切换到黑白单色位图,这使得FPS达到35但不是更多。现在根据我读过的大多数游戏开发书籍,为了让用户对游戏图形完全满意,2d游戏的FPS至少应该是40,那么有什么方法可以提高pygame的速度吗?

6 个答案:

答案 0 :(得分:17)

使用Psyco,用于python2:

import psyco
psyco.full()

此外,启用双缓冲。例如:

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

如果您不需要,也可以关闭alpha:

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标志,因为我在某些设置上遇到了问题。

使用这个,我已经为小型2d平台表现了相当不错的FPS和平滑度。

答案 1 :(得分:3)

加载图像时,如果绝对需要透明度或其他alpha值,请使用Surface.convert_alpha()方法。我一直在使用它进行我编程的游戏,并且性能大幅提升。 E.G:在构造函数中,使用以下命令加载图像:

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

据我所知,您对图像所做的任何转换都会保留此方法调用的性能。 E.G:

self.rotatedimage = pygame.transform.rotate(self.srcimage, angle).convert_alpha()
如果您使用的是已运行convert_alpha()的图片,则

会变得多余。

答案 2 :(得分:3)

所有这些都是很好的建议并且运作良好,但您还应该记住两件事:

1)在表面上模糊表面比直接绘制更快。因此,将固定图像预先绘制到曲面上(主游戏循环外部),然后将曲面blitting到主屏幕将更有效。例如:

# pre-draw image outside of main game loop
image_rect = get_image("filename").get_rect()
image_surface = pygame.Surface((image_rect.width, image_rect.height))
image_surface.blit(get_image("filename"), image_rect)
......
# inside main game loop - blit surface to surface (the main screen)
screen.blit(image_surface, image_rect)

2)确保您不会通过绘制用户无法看到的内容来浪费资源。例如:

if point.x >= 0 and point.x <= SCREEN_WIDTH and point.y >= 0 and point.y <= SCREEN_HEIGHT:
    # then draw your item

这些是帮助我保持高FPS的一些一般概念。

答案 3 :(得分:2)

使用图像时,使用转换() - 图像功能进行转换非常重要。 我已经读过convert()禁用alpha,这通常很慢。 我也有速度问题,直到我使用16位的颜色深度和我的图像的转换功能。现在我的FPS大约是150,即使我在屏幕上显示一个大图像。

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

旋转和缩放也需要花费大量时间来计算。如果变换的图像不可变,则可以将其保存在另一个图像中。

所以我的想法是计算一次并多次重复使用结果。

答案 4 :(得分:2)

首先,总是使用'​​convert()',因为它会禁用alpha,这会使blit更快。 然后只更新需要更新的屏幕部分。

global rects

rects = []

rects.append(pygame.draw.line(screen, (0, 0, 0), (20, 20), (100, 400), 1)) 

pygame.display.update(rects) # pygame will only update those rects

注意:

移动精灵时,你必须在列表中包含从最后位置开始的矩形。

答案 5 :(得分:1)

您可以尝试使用Psyco(http://psyco.sourceforge.net/introduction.html)。它通常会产生很大的不同。