作者aquarianboy (高 見龍)
看板Flash
標題Re: [討論] 物件佔用資源的問題
時間Thu Sep 2 01:28:12 2010
※ 引述《justaID (快樂崇拜)》之銘言:
: 想請教以下各種情況,對資源的影響:
: 1. 宣告某變數並new實體,但沒有addChild進舞台
: 那該物件是否佔用資源?
: EX: var x=new Apple(); (此時x是否已經佔用資源?)
: 2. 一個變數new 2次,資源也佔2份嗎?
: EX: var x=new Apple();
: x=new Banana(); (這樣會Apple和Banana各佔一份資源,還是Apple會釋放?)
: 2. remove之後,是否該物件的記憶體資源就能被釋放?
: EX: var x=new Apple();
: this.addChild(x);
: this.removeChild(x); (此時x佔用的資源是否被釋放了?
: 還是不存在stage上,但依然佔著資源?)
AS3有個東西叫做display list
只有被加到display list裡的東西,才有機會在畫面上被看到
怎麼讓東西加到display list? addChild(當然addChildAt也是)
反之,透過removeChild就是把東西移出display list
要注意的是移出display list跟visible = false是不一樣的事情
一個是根本不在場景上,一個是在場景上只是看不到而已
1. 是
即使不在display list也一樣,new的動作就是跟電腦要一塊記憶體來用
所以看不到也還是佔記憶體
2. 是,也不是
變數x一開始指向一個new Apple,過沒多久換指向new Banana
因為new Apple不再被x所指向,系統就會認為它沒人要,是"準備"要丟掉的東西了
至於什麼時候丟掉? 這就由GC機制決定了..也許很快,也許一下子
在GC還沒把垃圾收走的那個當下,它的確是佔兩份資源
收走了,就是只佔一份了
3. 否
同1,不在display list只是代表它不會被render出來讓你看到
但它還是存在記憶體裡的
--
http://blog.eddie.com.tw/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.116.139.9
推 ericinttu:請問Flash有特別針對GC做處理嗎? 像狀況2在C, 除非程式 09/02 01:47
→ ericinttu:終止, 要不然是回收不回來的(或許有別的方式但我不會) 09/02 01:48
→ ericinttu:另外, 關於 不在場景裡 跟 visible=false 的情況下, 對 09/02 01:50
→ ericinttu:畫面更新速度而言, 兩者是否有差異? 09/02 01:51
推 dsmwang:我猜有差吧?在場景列表裡的應該還需要檢查一次。 09/02 02:08
→ justaID:感謝詳細解說! 依照第2點的解說,如果是Array用splice() 09/02 02:47
→ justaID:移除元素,被移除的元素因為不再被陣列所指,就被列為準備 09/02 02:48
→ justaID:丟掉的垃圾,這樣對嗎? 09/02 02:49
→ justaID:(以上前提: 已經從畫面上removeChild() ) 09/02 02:49