所以,我做了一个小游戏,里面有一个手电筒。手电筒的分辨率相当高,所以我需要为每个角度预先复制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))手电筒图像是convert()格式的,没有颜色键或alpha通道。
显示手电筒:
def flashlightupdate(angle):
screen.blit(init.flashlights[angle], (340 - init.flashlights[angle].get_width()/2, 360 - init.flashlights[angle].get_height()/2))角度是度,根据鼠标的位置和玩家的位置计算得出。
谢谢。
发布于 2012-08-31 20:01:41
我将发布这篇文章作为答案,因为将一些注释组合在一起可能会同时解决内存和性能问题。
高RAM使用率是由于图像的数量(360),即使在磁盘上,也会占用至少266MB,Dikei指出,您必须考虑图像被表示为pygame对象,因此比原始位图使用更多的内存。
显然,为了避免使用800MB的RAM,您必须避免创建所有这些图像。
为了保持良好的性能,您可以只缓存0-90度的一些图像,然后使用比旋转快得多的翻转操作来构建其他旋转角度的图像(如halex所指出的)。
以这种方式,您可以肯定地消耗大约当前RAM的1/4,并且仍然具有可比较的渲染速度。
发布于 2012-09-04 09:58:44
如果您必须有那么多旋转,请创建一个pyOpenGL矩形,将纹理设置为手电筒。然后旋转它。
您可以使用pygame创建/输入窗口,使用pygame曲面处理OpenGL纹理,或者使用Pyglet或其他解决方案。
https://stackoverflow.com/questions/12212872
复制相似问题