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