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 的东西可能会有所帮助,但不确定如何适应它。欢迎提出任何关于如何提高性能的想法。
您可以做几件事。
- 只对
surface
执行一次 "multi-layer" blit,然后将 surface
每帧 blit 到 DISPLAYSURF
.
- 确定需要更新的屏幕部分并使用
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
部分设置颜色键。性能提高十倍!
我正在开发一个简单的拼贴游戏,它显示一个网格图像并用连续的图像层对其进行绘制。所以我有-
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 的东西可能会有所帮助,但不确定如何适应它。欢迎提出任何关于如何提高性能的想法。
您可以做几件事。
- 只对
surface
执行一次 "multi-layer" blit,然后将surface
每帧 blit 到DISPLAYSURF
. - 确定需要更新的屏幕部分并使用
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
部分设置颜色键。性能提高十倍!