Можно ли в Pygame рисовать много спрайтов на экране в каждом цикле без значительной задержки?

В моей программе редактирования карт у меня есть 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 рисует фон поверх этих спрайтов, чтобы сделать возможным удаление / замену спрайтов. Это заставляет перерисовывать спрайты в каждом необходимом в данный момент цикле.

Цикл выглядит так:

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()

Я пробовал составить список сравнения и рисовать фон только один раз, но при удалении спрайтов остается задержка, и я не могу заставить работать функцию мыши.

Есть мысли о том, разрешима ли эта ситуация? Есть ли способ сжать список спрайтов, который нужно нарисовать до одного объекта, вместо того, чтобы перебирать весь список из сотен? Любая помощь приветствуется!


person Ray Heredia    schedule 07.07.2020    source источник


Ответы (1)


Основная проблема заключается в том, что вы загружаете изображения в каждый кадр. 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))
person Rabbid76    schedule 07.07.2020
comment
Спасибо, не решил мою непосредственную проблему, потому что я не включил большую часть своего кода, но указание меня на surface_list было достаточно, чтобы исправить это. Я создал блитлист, чтобы указать положение спрайта X + Y + в его уникальном списке, и пропустил его через свой код. Спасибо! - person Ray Heredia; 08.07.2020