Да, это довольно просто.
Самый простой подход, чтобы просто создать dict
, который будет функционировать в качестве кэш-памяти, а также способ для загрузки изображений из этого кэша:
image_cache = {}
def get_image(key):
if not key in image_cache:
image_cache[key] = pygame.image.load(key)
return image_cache[key]
(Если вам нужно больше функциональности, возможно, создать класс для этого).
Теперь, когда вы хотите использовать изображение, используйте get_image
функцию:
class Player(object):
def __init__(self):
self.image = get_image('image1.png')
Все изображения теперь кешированные один раз загружен и повторно использовать, если вы хотите использовать один и тот же образ снова и снова.
Для предварительной загрузки всех изображений при запуске, вы можете создать список всех изображений самих
images = ['image1.png', 'image2.png', 'image3.png']
или просто получить имена всех изображений в определенной папке
import glob
images = glob.glob('*.png')
и загрузить все изображения один раз:
# ensure all images are loaded
for image in images:
get_image(image)
Также обратите внимание, что еще одним распространенным узким местом является рендеринг шрифтов, что довольно дорого. Вы можете кэшировать поверхности шрифтов, создавая с помощью Font.render
с помощью той же методики (используя простой dict
).
при загрузке вы можете добавить вызов '.convert()' или '.convert_alpha()', чтобы ускорить блиты. Предварительная загрузка была бы идеальным местом для этого. См. Http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert – kratenko
Сцарапать последний комментарий. Для загрузки моей карты больше не требуется 20 секунд, и я достигаю гораздо большей, чем моя стандартная частота кадров. Сначала я получал что-то вроде 12 кадров в секунду, но нет, я получаю больше 60. Спасибо, ребята, так много^_ ^. Это также с 1000 изображений, связанных с экраном (карта 100x100) – ReallyGoodPie