我一直在用Tkinter编写一个非常简单的Python游戏,看看是否可以。有一个包含所有游戏对象的列表,主循环中的每一个滴答都被循环通过,列表中的每个对象都会吸引自己到窗口。
每当用户触发激光时,就会动态地将新的激光对象添加到列表中,而不将其分配给变量。以简化的形式,是这样的:
if buttonIsPressed:
game.itemlist.append(LaserObject())
当激光自绘制时,它测试它在窗口中的位置,当它到达某个点时,它将自己从列表中删除,不再绘制。它没有其他的引用,但它似乎仍然存在于记忆中。
当发射激光,并因此创造更多的激光对象,程序的内存使用量上升和上升。作为一个测试,我这样做,直到内存使用量达到10 it,然后我让程序在那里坐一个小时,看看那些没有引用的激光物体是否会被垃圾收集,程序的内存使用量会下降,但它从来没有。它正好停留在10 MB。
在这种情况下,我还需要做些什么才能让那些激光物体被正确地收集起来,这样它们就不会继续占用内存,并且程序的整体内存使用可以保持稳定?
发布于 2014-12-20 21:46:35
事实证明,这个问题与一个标签没有从内存中删除有关。
最初,每个LaserObject内部都有一个标签,用于绘制激光图像。后来,我切换到直接在画布上绘制图像,但是Label对象保留在LaserObject中,没有被正确删除。
当我从LaserObject中完全删除标签时,图像开始像在画布上疯狂地闪烁,可能是因为标签保留了对图像的引用,从而帮助它避免过早收集垃圾或诸如此类的东西。
对于这种情况,最好的解决方案是允许标签保留在LaserObject中,但是在从项目列表中删除LaserObject时添加代码来销毁标签。如下所示:
if laser.y == past_edge_of_window:
self.game.itemlist.remove(laser)
self.label.destroy()
这告诉Tk清理标签对象的所有内部代码,并保持内存使用稳定。
https://stackoverflow.com/questions/27578874
复制相似问题