【问题标题】:Pygame: slow performance using pygame.Surface and convert_alpha()Pygame:使用 pygame.Surface 和 convert_alpha() 会降低性能
【发布时间】:2016-10-24 16:21:30
【问题描述】:

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

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

【问题讨论】:

    标签: python-2.7 pygame pygame-surface


    【解决方案1】:

    您可以做几件事。

    1. 只对surface 执行一次“多层”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) 
    

    【讨论】:

    • 感谢您的建议,您能否大致告诉我这两种方法在我的代码中的语法可能看起来像什么?
    • 添加了 1 的示例。对于数字 2,这完全取决于您如何知道要绘制什么,并且通常需要您构建游戏返回更新 Rect 以便您可以构建您的列表以传递给screen.update().
    • 非常感谢,我可以将这个示例与我目前构建的内容一起使用,非常有帮助。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2015-07-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多