2017-05-15 110 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