任何加速 Python 和 Pygame 的方法?

新手上路,请多包涵

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

原文由 ApprenticeHacker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 786
2 个回答

使用 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 和平滑度。

原文由 Alexander 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

  1. Blitting surfaces to surfaces 比直接绘制更快。因此,预先将固定图像绘制到表面上(在主游戏循环之外),然后将表面 blit 到主屏幕会更有效率。例如:
 # 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)

  1. 确保你没有通过绘制用户看不到的东西来浪费资源。例如:
 if point.x >= 0 and point.x <= SCREEN_WIDTH and point.y >= 0 and point.y <= SCREEN_HEIGHT:
    # then draw your item

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

原文由 The4thIceman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏