2008-08-22 69 views
1

我的網站完全基於Flash,它圍繞一個3D模型進行移動,該模型以我已轉換爲FLV文件的視頻塊的形式呈現給我。我正在使用FLVPlayback組件來控制我的程序中的視頻。在使用System.totalMemory運行內存檢查時,我注意到,每當加載視頻時,它都會佔用大量內存,即使我從中刪除了所有事件偵聽器(它們都是弱引用的),將組件從它的父節點,停止視頻並將組件實例歸零,它仍然不會返回該內存。FLVPlayback組件內存問題

自從我開始在這個項目上工作以來,這一直困擾着我,因爲用戶可能實例化和加載的大量視頻。目前,每當需要時,每個視頻都會加載到一個新的FLVPlayback實例中,但是我已經讀過,也許解決這個問題的最好方法是僅僅擁有一個全局FLVPlayback實例,並將新視頻重新加載到舊實例中,應用程序內存中只會有一個FLVPlayback組件。

有沒有其他人也遇到過這個問題?您是否找到了比使用全新實例更好的解決方案,您只需重新使用每個新視頻?

回答

1

不幸的是,在Flash添加析構函數和顯式對象刪除之前,您無法幫助解決內存問題。看到這個線程:

Unloading a ByteArray in Actionscript 3

有到閃存的小應用程序有多少可以使用的限制;氣相色譜似乎在達到這個極限時開火。我看到我的記憶容易的小程序使用多達〜200MB,只是因爲他們跑了幾個小時,GC不想踢。

哦,我不認爲使用單個實例也是一個優雅的解決方案。目前我只爲我的自定義類編寫dispose()函數,等待有一天它可以變成適當的析構函數。

0

不幸的是,這就是閃存處理它的方式。不是特別聰明,但它適用於大多數人。

2

我從來沒有真正喜歡這些組件,他們有點狡猾。這個特殊的問題似乎很常見,而且正如你所建議的那樣,有些惱人的解決方案是隻有一個FLVPlayback並重用它。

Here's a blog post about it

1

感謝您的答覆,鏈接到其他博客的問題是有幫助的,以及,我讀了所有的垃圾收集格蘭特斯金納的信息太多,但通過這些鏈接搜索和返回並重新閱讀他原先對GC的看法,幫助刷新了舊的頭腦。除了將單個FLVPlayback組件零化和重新實例化之外,我還意識到我沒有正確地卸載和銷燬我的Loader實例,所以我清理了它們,現在程序運行得更加高效。我認爲該網站的內存使用率已經提高了約90%。

@aib我會承認單實例解決方案並不優雅,但因爲Flash不會放棄那些FLV文件,所以我很困惑它。

@grapefrukt我討厭閃存組件,它們通常會比保存時間帶來更多的悲傷,但在這種情況下,我有很多提示點和導航內容與視頻文件進行,FLVPlayback組件是最好的解決方案找到。當然,我還是相當新的動作世界,所以也許我看起來有些東西

我也希望我有聲望upvote你的答案,因爲他們都有幫助... c'est la vie

1

從我經過大量測試後得到的結果是,flash會根據需要動態加載庫和組件,但絕不會垃圾收集該數據。例如,如果我有一個使用FLVPlayback組件的網站或Air應用程序,則在創建新的FLVPlayback()實例之前,不會加載與其關聯的實際組件和庫。然後它會將庫和組件加載到內存中,但在程序/網站關閉之前,您將永遠無法獲得該空間。只要您從中刪除偵聽器,將其從視圖中移除並將其設置爲空,該視頻內部的特定實例將收集垃圾並釋放一些內存。

此外,如果您正在製作單獨的視頻,VideoPlayer的重量更輕,清理起來更好。