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

标签 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))

手电筒图像经过convert()处理,并且没有颜色键或alpha channel 。

显示手电筒:

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

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

谢谢。

最佳答案

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

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

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

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

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

关于python - Pygame-transform.rotate 结果使用大量 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12212872/

相关文章:

python - python中的多线程网络请求—— 'Name or service not known'

python - 如何让 for 循环在 python 2.7 中与 tkinter 一起工作?

c - 为什么将我的输入分配给枚举会导致段错误?

file - 如何在 lua 中读取大文件(演出或更多)?

python - 如何将二十一点游戏的两个重复 for 循环转换为单个函数

python - Python 的 id() 有多独特?

python - 为什么 Pygame 不显示我的 pdf?

python - 如何停止致命的Python错误: PyEval_SaveThread: NULL tstate

python - 我的碰撞函数中的 For 循环从未命中?

python - Django 和 AddThis 社交登录