【问题标题】:Pygame - transform.rotate results are using a lot of RAMPygame - transform.rotate 结果使用大量 RAM
【发布时间】:2012-08-31 09:47:46
【问题描述】:

所以,我正在制作这个你有手电筒的小游戏。手电筒的分辨率相当高,所以我需要为每个角度预缓存它的 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))

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

谢谢。

【问题讨论】:

  • 首先,为什么每 360 个圆圈需要一张图片?玩家的“手电筒方向控制”有多精细?
  • 它需要尽可能细粒度,但游戏目前有一个低分辨率选项,需要大约 200MB 的 RAM,但是游戏需要每隔一次变换.scale2x 低分辨率手电筒框架。手电筒随着鼠标的移动而旋转。
  • 你给flashlightinit()打了多少次电话?
  • 制作这些副本是一种提高性能的紧急解决方案,所以如果有任何其他方法可以快速完成这项工作,那就太好了。
  • flashlightinit() 在启动时只被调用一次。

标签: python memory pygame ram


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 翻页速度还是很慢,但只有这些了。
  • 顺便说一下,尝试阅读this。也许那里的一些建议可能会帮助您提高速度。此外,您可以做更多的缓存[例如保存其他 30 个最常用或最近使用的位置] 以尝试避免不必要的翻转……但对性能的影响在很大程度上取决于对象的旋转方式。如果它只是随机旋转,这将无济于事,如果旋转具有某种形式的“局部性”,那么缓存一些最近的位置可能会有所帮助,但要避免缓存太多。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多