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

App*_*ker 12 python performance pygame frame-rate

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

Ale*_*der 18

使用Psyco,用于python2:

import psyco
psyco.full()
Run Code Online (Sandbox Code Playgroud)

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

from pygame.locals import *
flags = FULLSCREEN | DOUBLEBUF
screen = pygame.display.set_mode(resolution, flags, bpp)
Run Code Online (Sandbox Code Playgroud)

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

screen.set_alpha(None)
Run Code Online (Sandbox Code Playgroud)

不是每次都翻转整个屏幕,而是跟踪已更改的区域并仅更新这些区域.例如,大致像这样的东西(主循环):

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)
Run Code Online (Sandbox Code Playgroud)

大多数(全部?)绘图函数返回一个矩形.

您还可以仅设置一些允许的事件,以便更快速地处理事件:

pygame.event.set_allowed([QUIT, KEYDOWN, KEYUP])
Run Code Online (Sandbox Code Playgroud)

此外,我不打算手动创建缓冲区,也不会使用HWACCEL标志,因为我在某些设置上遇到了问题.

使用这个,我已经为小型2d平台器获得了相当好的FPS和平滑度.

  • "我的RPG的所有精灵都被瓦片引擎首先插入到一个巨大的表面上然后那个表面在屏幕上显示出来"是的,这是一个问题.你应该只对那些需要blitting的东西进行blit - 在精灵周围放置边框,并且只对实际触摸屏幕的那些进行blit. (2认同)
  • 谢谢 - 我正在探索使用树莓派 (2认同)

The*_*man 5

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

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)
Run Code Online (Sandbox Code Playgroud)

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

if point.x >= 0 and point.x <= SCREEN_WIDTH and point.y >= 0 and point.y <= SCREEN_HEIGHT:
    # then draw your item
Run Code Online (Sandbox Code Playgroud)

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