预加载图像 pygame

Rea*_*Pie 1 python pygame

我制作了一款目前存在帧速率问题的游戏。我确实认为问题在于我当前正在加载的图像数量相当大,所以我的问题是:“有没有办法预加载图像?所以基本上在使用之前就加载它们?”

我不知道这是否可行,但在我看来这听起来不错。所以基本上没有任何东西被绘制到屏幕上,但是图像已经准备好,没有任何延迟(或最小延迟)。

slo*_*oth 5

是的,这很简单。

最简单的方法是创建一个dict充当缓存的函数,以及从该缓存加载图像的方法:

image_cache = {}
def get_image(key):
  if not key in image_cache:
    image_cache[key] = pygame.image.load(key)
  return image_cache[key]
Run Code Online (Sandbox Code Playgroud)

(如果您需要更多功能,可以为此创建一个类)。

现在,当您想使用图像时,请使用以下get_image函数:

class Player(object):
  def __init__(self):
    self.image = get_image('image1.png')
Run Code Online (Sandbox Code Playgroud)

现在,如果您想一次又一次使用同一图像,所有图像在加载后都会被缓存并重复使用。

要在启动时预加载所有图像,您可以自己创建所有图像的列表

images = ['image1.png', 'image2.png', 'image3.png']
Run Code Online (Sandbox Code Playgroud)

或者简单地获取特定文件夹中所有图像的文件名

import glob
images = glob.glob('*.png')
Run Code Online (Sandbox Code Playgroud)

并加载所有图像一次:

# ensure all images are loaded
for image in images:
  get_image(image)
Run Code Online (Sandbox Code Playgroud)

另请注意,另一个常见的瓶颈是字体渲染,这是相当昂贵的。您可以缓存使用Font.render相同技术创建的字体表面(使用简单的dict)。

  • 当您加载它们时,您可能需要添加对 `.convert()` 或 `.convert_alpha()` 的调用,以加快位块传送速度。预加载将是执行此操作的最佳位置。请参阅http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert (3认同)