2017-05-15 114 views
1

我做了一个小的tkinter游戏,它使用turtle作为图形。这是一个来自Cracker Barrel的Triangle Peg Game的模拟,它能够告诉玩家在游戏中的任何一点上做出的下一个最佳动作,以及其他功能。挂钩只是turtle.RawPen的一个子类的实例,并且我保留大量简单的RawPen实例来绘制表示移动的箭头。如何完全删除乌龟

我注意到当我重新启动游戏(调用​​)来杀死乌龟窗口时,内存消耗实际上增加了,因为海龟似乎没有被删除。即使我事先打电话window.clear(),其中清除_turtleswindow.__dict__,仍然有对乌龟的参考。我确保在重新启动过程中删除了所有对它们的引用,所以这不是问题。有什么办法可以真正删除一只乌龟,这样可以收集垃圾吗?

+0

我打了这个,并得出结论,你必须同时调用'window.clear()''然后window.bye()'来获得个人龟引用计数下降到零。 '.clear()'处理'window._turtles','.bye()'处理像'onclick()'这样的海龟事件方法引起的额外引用。不能说你的额外引用来自哪里。 – cdlane

+0

我在调试过程中使用过'gc.get_referrers()'(我将它们存储在'peg_dir','graveyard'和'artist_dir'中),唯一的引用是包含它们的列表,'window._turtles',和事件方法。我尝试使用'window.clear()',然后'window.bye()','gc.collect()'表示'peg_dir'中的对象无法访问。不知道为什么。我会研究它。 –

回答

1

删除我的所有对象的引用在画布(包括,当然,TurtleWindow),然后破坏画布canvas.destroy()的伎俩。也许还有其他解决方案,但这是我能想到的最好的。我非常感谢大家的帮助,因为它将在未来为我提供良好的服务,至少不会使用API​​创建的对象。

0

您是否尝试删除耗费内存的对象,然后使用Python内置的garbage collector接口明确收集垃圾?

import gc 
... 
# Delete memory-consuming object 
del window._turtles 
# Collect the garbage 
gc.collect() 
+0

我在调试过程中尝试过,对象无法访问,但我会再试一次,并确保所有引用都不再存在。不过,我不明白为什么会有所帮助。无论如何,如果没有引用,垃圾收集不应该自动发生,并且如果有引用,甚至是明确的垃圾回收也不可能? –

+1

我曾经有一个项目,其中一个函数使本地使用大型的Numpy数组。我期望这个数组在离开函数作用域时自动进行垃圾收集,但是我的CPU使用率表明Python仍然保留了一些隐藏的引用...在离开函数之前调用'del array'和'gc.collect()'使我真正释放了内存。 – Josselin

1

通常做的事情,以摆脱龟数据是复位()

carl=Turtle() 
.... code 
carl.reset() 

海龟的列表,在这里金,唐纳德,芬妮与坦诚是所有海龟:

group=[kim,donald,fanny,frank] 
for turtle in group: 
    turtle.reset() 

还为特定的屏幕上的所有海龟的便利代码,这是一个建在被称为列表(screen.turtles)。所以,如果你有一个屏幕调用屏幕:

screen=Screen() 
... 
code 
.... 

for turtle in screen.turtles(): 
    turtle.reset() 
+0

您的'reset()'循环显示在屏幕上。turtles()'实际上就是'turtle.resetscreen()'(又名'turtle.Screen().setset()')。 'turtle.reset()'释放的重要内存(即OP的问题)是清除乌龟的**撤消**缓冲区,其他内存元素将被重置为其默认值。为了鼓励海龟的垃圾回收,可以使用'turtle.clearscreen()'(又名'turtle.Screen().clean()')并将所有包含变量的海龟设置为None。 – cdlane