0

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

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 的东西可能会有所帮助,但不确定如何适应它。任何关于如何提高性能的想法都非常受欢迎。

4

2 回答 2

2

您可以做几件事。

  1. 只对 a 执行一次“多层”blit,surface然后将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) 
于 2016-10-24T16:33:13.677 回答
0

您应该colorkey在不需要每像素 alpha 时使用。我只是将代码中的所有内容更改为简单的转换并为图像的全部部分convert_alphas设置颜色键。opaque性能提升十倍!

于 2021-12-12T00:21:03.100 回答