在 Pygame 中,你能在没有明显延迟的情况下在每个循环中向屏幕绘制许多精灵吗?

In Pygame, can you draw many sprites to the screen each loop without significant delay?

在我的地图编辑程序中,我有 3 个主要功能。

  1. 添加精灵
  2. 正在删除精灵
  3. 当前选中的精灵跟随鼠标

我遇到的问题是我使用循环遍历所有“添加的精灵”并将它们绘制到屏幕上。由于此循环的 MS 延迟,屏幕上的精灵越多,延迟越明显,绘图越难

    while item_list_item_amount > item_list_iterator:
        display.blit(pygame.image.load("imgs\tiles\" + sprite_list[item_list_iterator]), (x_list[item_list_iterator] * 16, y_list[item_list_iterator] * 16))
        item_list_iterator += 1

每个“Mainloop”循环都会在这些 sprite 上绘制背景,从而使删除/替换 sprite 成为可能。这使得当前需要在每个循环中重新绘制精灵。

循环看起来像这样:

while main_loop == True:
    #Main starts loop here
    #Update the currently selected tile
    display.fill(BGC)
    display_listed_tiles()
    
    #Uses mouse coordinates to blit tile over current mouse location
    display.blit(tile, (row * 16, col * 16))
    
    screen.blit(pygame.transform.scale(display, WINDOW_SIZE), (0, 0))

    #Updates screen
    pygame.display.update()

我试过制作一个比较列表,只绘制一次背景,但在删除精灵时仍然存在延迟,我无法使用鼠标功能。

想知道这种情况是否可以解决吗?有什么方法可以压缩需要绘制到一个对象的“精灵列表”,而不必迭代整个数百个列表?感谢您的帮助!

主要问题是您在每一帧中加载图像。 pygame.image.load 是一个非常昂贵的操作,因为它必须从数据存储中读取图像。
初始化加载一次图片,绘图时使用:

surface_list = [pygame.image.load("imgs\tiles\" + name) for name in sprite_list]
for item_list_iterator in range(item_list_item_amount):
    display.blit(surface_list[item_list_iterator], (x_list[item_list_iterator] * 16, y_list[item_list_iterator] * 16))