AS3 Loader加載卸載外部swf,記憶體無法釋放

191 views
Skip to first unread message

Focus1921

unread,
Oct 19, 2009, 6:09:53 AM10/19/09
to 台灣 Adobe 使用者俱樂部
這是個看起來非常單純的問題,但沒想到卻是這麼的難處理,目前我手邊沒有實際的code,但是平常的專案會需要用到一個主swf去load其他子swf
的問題,為了能夠讓卸載的swf不再佔用記憶體,在卸載的swf程式中也仔細的清除了我所知道的引用、偵聽,BitmapData dipose...
等等,也使用了FP10後增加的unloadAndStop(true),甚至也用上了GC Hack,當然這樣做後,能釋放掉大部分的記憶體佔用,但
少部分未清除的引用或是偵聽卻會慢慢一點一點的把記憶體用完,不曉得有沒有一個方法能確實釋放unload掉的swf所佔用的記憶體??意思就像是主
swf跟每一支子swf都是獨立的,加載進來時佔用記憶體,卸載時釋放子swf所佔用的記憶體。

會提出這麼不智又不負責任的想法,是由於不可能整個project都由一人負責,若他人所寫的swf沒有作資源管理,那豈不是一個大漏洞?就算是對資源
管理有概念的人,有時也不能這麼周到的把所有該清的引用、該移除的偵聽、該關的連線... 等等都移除,另外有時可能會用上第三方的組件所建立的
swf,這些swf大多沒有考慮到作為模組被載入,不曉得各位會不會遇到相關問題,有沒有什麼相關的解決方法,或是各位如何避免記憶體被加載卸載的動作
來浪費,或是有什麼需要注意的地方來減少這樣的事情發生,歡迎各位提出意見,非常感謝。

MokaDesign

unread,
Oct 20, 2009, 3:43:03 AM10/20/09
to 台灣 Adobe 使用者俱樂部
或許利用介面強制實作的特性,在多人合作專案可以大幅降低記憶體式放問題
interface IRelease{ function releaseMem():void{}}

Focus1921

unread,
Oct 20, 2009, 8:22:43 AM10/20/09
to 台灣 Adobe 使用者俱樂部
這的確是個好方法!! 在多人合作專案可以保證每一個swf至少有一個方法來釋放記憶體(我對OO還不是很熟,我會好好研究介面強制實作的部分)。非
常感謝您的回覆。

另外一部分,其實也是我目前遇到最大的困擾~~ = = 公司的專案時常會使用第三方組件來製作特效,但大部分的組件都是以獨立執行來設計,很少考
量到被當作模組載入至主要的swf,也因此在釋放資源部分處理的奇差無比,都是僅僅幾次的加載卸載後就會佔用所有的記憶體,而這些組件通常是
compiled,應該也是經過加密,因為我用新版的decompiler出的code無法再順利通過編譯,我想是加密的干擾吧!?anyway, 也
因為decompile得到了部分的code,發現該組件內部有很多private的屬性是new新的movie clip出來,如果我用遞迴來走訪整
個顯示清單,發現是movie clip就null,這樣可以移除物件內部私有屬性的引用嗎?(實驗結果是完全沒有釋放的跡象,倒是如果用遞迴走訪發現
bitmap就把bitmap的bitmap data dispose掉,可以大幅釋放記憶體)。

另外,該組件有許多方法內宣告的函數(function closure??),之前看過Ticore大的文章提過AS3的Function
Closure在GC上有些Bug,記憶體累加的部分是否有可能是因為沒有清除那些Function closure??抱歉我說的很空洞,我會再找時
間作個小demo來跟大家討論。

> > 來浪費,或是有什麼需要注意的地方來減少這樣的事情發生,歡迎各位提出意見,非常感謝。- 隱藏被引用文字 -
>
> - 顯示被引用文字 -

Reply all
Reply to author
Forward
0 new messages