2013-07-12 4 views
1

Я сделал игру, в которой в настоящее время проблема с частотой кадров. Я действительно считаю, что проблема заключается в довольно большом количестве изображений, которые я загружаю в настоящее время, поэтому мой вопрос: «Есть ли способ предварительной загрузки изображений? Так что, в основном, загружайте их, прежде чем их использовать?»Предварительная загрузка изображений pygame

Я не знаю, возможно ли это, но это звучало хорошо в моей голове. Таким образом, на экране ничего не рисуется, но изображения готовы без какой-либо задержки (или минимум).

ответ

4

Да, это довольно просто.

Самый простой подход, чтобы просто создать 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).

+3

при загрузке вы можете добавить вызов '.convert()' или '.convert_alpha()', чтобы ускорить блиты. Предварительная загрузка была бы идеальным местом для этого. См. Http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert – kratenko

+0

Сцарапать последний комментарий. Для загрузки моей карты больше не требуется 20 секунд, и я достигаю гораздо большей, чем моя стандартная частота кадров. Сначала я получал что-то вроде 12 кадров в секунду, но нет, я получаю больше 60. Спасибо, ребята, так много^_ ^. Это также с 1000 изображений, связанных с экраном (карта 100x100) – ReallyGoodPie

Смежные вопросы