Pygame:使用pygame.Surface和convert_alpha()表现缓慢

时间:2016-10-24 16:21:31

标签: python-2.7 pygame pygame-surface

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

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 个答案:

答案 0 :(得分:2)

你可以做几件事。

  1. 执行"多层"只需一次surface,然后只需将surface每帧移至DISPLAYSURF
  2. 确定需要更新的部分屏幕并使用screen.update(rectangle_list)代替screen.flip()
  3. 编辑以添加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)