Pygame - transform.rotate结果使用了大量的RAM

时间:2012-08-31 09:47:47

标签: python memory pygame ram

所以,我正在制作这个有手电筒的小游戏。手电筒的分辨率非常高,所以我需要为每个角度预先安装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))

角度是度数,根据鼠标的位置和玩家的位置计算。

感谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:2)

如果必须进行多次旋转,请创建一个pyOpenGL矩形,将纹理设置为手电筒。然后旋转它。

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