Pygame:使用 pygame.Surface 和 convert_alpha() 时性能低下

Pygame: slow performance using pygame.Surface and convert_alpha()

我正在开发一个简单的拼贴游戏,它显示一个网格图像并用连续的图像层对其进行绘制。所以我有-

list_of_image_tiles = { GRASS: pygame.image.load('/grass.png').convert_alpha(), TREES: pygame.image.load('/trees.png').convert_alpha(), etc}

后来我把这些-

DISPLAYSURF.blit(list_of_images[lists_of_stuff][TREES], (col*TILESIZE,row*TILESIZE))

DISPLAYSURF.blit(list_of_images[lists_of_stuff][GRASS], (col*TILESIZE,row*TILESIZE))

请注意,为简洁起见,我没有包含很多代码,但它基本上可以工作 - 除了性能非常慢。如果我注释掉 DISPLAYSURF 的东西性能飞跃,所以我认为我需要一个更好的方法来做 DISPLAYSURF 的东西,或者可能 pygame.image.load 位(convert_alpha() 是最好的方法,记住我需要分层图像方法?)

我读了一些叫做 psycho 的东西可能会有所帮助,但不确定如何适应它。欢迎提出任何关于如何提高性能的想法。

您可以做几件事。

  1. 只对 surface 执行一次 "multi-layer" blit,然后将 surface 每帧 blit 到 DISPLAYSURF.
  2. 确定需要更新的屏幕部分并使用 screen.update(rectangle_list) 而不是 screen.flip()

编辑以添加 1 的示例。 注意:您没有提供太多代码,所以我只是将其与我的工作方式相结合。

# build up the level surface once when you enter a level.
level = Surface((LEVEL_WIDTH * TILESIZE, LEVEL_HIGHT * TILESIZE))
for row in range(LEVEL_HIGHT):
    for col in range(LEVEL_WIDTH):
        level.blit(list_of_images[lists_of_stuff][TREES], (col * TILESIZE, row * TILESIZE))
        level.blit(list_of_images[lists_of_stuff][GRASS], (col * TILESIZE, row * TILESIZE))

然后在绘制部分的主循环中

# blit only the part of the level that should be on the screen
# view is a Rect describing what tiles should be viewable
disp = DISPLAYSURF..get_rect()
level_area = Rect((view.left * TILESIZE, view.top * TILESIZE), disp.size)
DISPLAYSURF.blit(level, disp, area = level_area) 

只要不需要每像素 alpha,就应该使用 colorkey。我只是将代码中的所有 convert_alphas 更改为简单转换并为图像的完整 opaque 部分设置颜色键。性能提高十倍!