2

所以,我正在制作这个你有手电筒的小游戏。手电筒的分辨率相当高,所以我需要为每个角度预缓存它的 360 个副本,以避免实时旋转它,这会占用大量的计算能力。图像是 1002x246 和 .png,但非常简单,所以它只占用了 3.95KB 的硬盘驱动器。但是当我在游戏中制作 360 个副本并将它们添加到列表中时,它们会占用大约 800MB 的 RAM。这是相当多的。为什么?我怎样才能减少它?

编码:

def flashlightinit():
    init.flashlights = []
    fl = files.flashlight
    for i in range(360):
        init.flashlights.append(pygame.transform.rotate(fl, -i))

手电筒图像经过转换()处理,没有颜色键或 alpha 通道。

显示手电筒:

def flashlightupdate(angle):
    screen.blit(init.flashlights[angle], (340 - init.flashlights[angle].get_width()/2, 360 - init.flashlights[angle].get_height()/2))

角度是度数,由鼠标的位置和玩家的位置计算得出。

谢谢。

4

2 回答 2

3

我将把它作为答案发布,因为将一些评论组合在一起你可能会解决内存和性能问题。

高 RAM 使用率是由于图像数量(360),即使在磁盘上,也将占用至少266MB,正如 Dikei 指出的那样,您必须考虑将图像表示为 pygame 对象,因此使用的内存比原始位图。

为了避免使用 800MB 的 RAM,你显然必须避免创建所有这些图像。

为了保持良好的性能,您可以只缓存一些 0-90° 度的图像,然后使用比旋转快得多的翻转操作来构建其他旋转角度的图像(正如 halex 指出的那样)。

通过这种方式,您肯定可以消耗大约 1/4 的当前 RAM,并且仍然具有相当的渲染速度。

于 2012-08-31T12:01:41.157 回答
2

如果你必须有这么多的旋转,创建一个 pyOpenGL 矩形,将纹理设置为你的手电筒。然后旋转那个。

您可以将 pygame 用于窗口创建/输入,将 pygame 表面用于 OpenGL 纹理,或者使用 Pyglet 或其他解决方案。

于 2012-09-04T01:58:44.467 回答