星期四, 1月 25, 2007

數位切片突破

今天一直研究Memory leak的問題,有一些小發現:

首先,Actionscript的delete很奇怪,不能對class的fixed member執行delete,只能對動態加入的資料成員進行delete。如果各位看官熟C++的話,那麼fixed member和吾人一般在C++看到的class member似乎並無差別,而dynamic member,根據我對Adobe Labs和Livedocs的印象,似乎是在class的內部偷偷塞個Map,然後動態增加member就是把pointer塞進那個map,存取的時候自然就是查map。dynamic member好處是自由度高,壞處當然就是複雜度和不可預測性囉(誰知道某物件在某時間的某member是不是當初宣告的樣子?), Actionscript之所以會有這些讓吾輩C++設計師覺得怪異的東西,其實是因為Actioscript 3同時實作了prototype-based OOP和Class-based OOP。但因為我的程式沒有使用到繼承,所以細節我就不清楚了(沒錯,沒用到就不必去讀那部份的資料,這就是趕工啊orz)。

話題轉回delete這件事情上面。根據Google大神的資料顯示,Actionscript就算成功delete了某個reference,其實資源並不會馬上釋放,而是要等每隔一段時間才來一次的Garbage Collection和Mark and sweep大駕光臨,做一些Reference Counting檢查和很耗成本的BFS之後,資源才有再度解放的可能。用白話文說,不管你把reference設成null也好(不要和C++的reference搞混orz),用delete摧毀他也好,記憶體就是不還你就對了(我至今還沒看過Garbage Collection大駕光臨啊)。

難道使用本座作品的人就得面對每秒鐘記憶體消失1%的命運?

後來靈光一閃,突然間很想大罵自己是笨蛋,用Object Pool就好了嘛!馬上自己用一些小變數和一些不漂亮的寫法實做了出來。歐耶!再也不會吸乾記憶體了!



寫的好累,去運動一下,下一個目標就是Zooming! 全文連結

0 意見: