每日必看blog 一枚 – Tinic Uro

tinic 是macromedia flash player Principal Engineer,主要工作就是負責研發flash player 8 裏面的 graphic, audio與video功能,而這次的新版本中,最令人注意的就是 on2 VP6 video codec, 32 channel sound 與全新的 bitmap engine, 這也就是說 tinic桑就是最直接的消息來源,有什麼事直接問他就好阿~
他的blog文章都是很典型的工程師寫法,大量條理分明且清淅的文字序述(很少會見到圖片),針對一個主題深入入淺出的解釋 1、面臨的挑戰 2、實作的問題 3、解決的方法 4、注意事項與小技巧。
我之前的文章曾經提過,對flash player這個 VM與Compiler的底層運作方式與原理越瞭解,就越能幫助避開陷井並善用某些奇技淫巧,例如如何將video壓到最小但畫質不受影響,或是如何騙過VM/Compiler的限制來達到某些功能。
通常這種小細節就是從資深玩家或類似 tinic這樣的原廠工程師嘴裏講出來,大家才會知道,而大多數時後,都是原廠工程師講的比較對,例如gary grossman一句話可能就可以解決flashcoders上幾十篇的論戰,也可以省去玩家們幾天的trial and error實驗。
順便提個小小問題,呃,也算是奇技淫巧級的dirty trick,看是否有人能回答。
通常使用 loadMovie(), attachMovie()等方式放到畫面上的mc是可以用removeMovieClip()移除的,但如果是在authoring time就放在stage上的mc,也可以移得的掉嗎? 該用什麼方法?
by admin


4 Comments Add your own
1. jeremy&hellip | August 23rd, 2005 at 9:50 am
呃 看來這題太難,似乎沒人有興趣回答…(還是其實這件事根本是做不到的啊~)
2. tanjun&hellip | August 26th, 2005 at 12:44 am
雖然方法不是我想的,但是可以參考…
http://blog.masolin.com/?p=144
3. jeremy&hellip | August 26th, 2005 at 1:18 am
謝謝tanjun的回答。
根據很久前在 flashcoder上看到的解決方法,基本上是用 swapDepths()將authoring time建立的 movieclip 由負數的level移到正數的level,就可以用 removeMovieClip()拿掉了。
但要注意那串文章中的範例使用這句:
btn.swapDepths(this.getNextHighestDepth());
這可能會造成另一個麻煩,因為 getNextHighestDepth()非常邪惡,很有可能將這個btn給移到某個特定的空間中,然後就再也reference不到了,如果一定要用這個function,至少得拿掉前面的 this,不然它是以btn為基礎去做swapDepths。
另外討論中提到btn的問題,感覺上不是很嚴重,因為這年頭應該很少人還在用button做btn,大部份都應該改用mc做btn了,但想到用 __proto__ 騙過compiler將它當mc處理確實很聰明啊~
最後那個reply中說可以用 unloadMovie(btn)移掉btn,然後再加個 btn = undefind,這兩句都不正確。首先 unloadMovie(btn)雖然在視覺上造成btn消失,但實際上它還正佔了記憶體,並且不會在下一次的GC中被移除,而加上一句 btn = undefind則是自欺欺人,這句等於是建了一個新的變數叫 btn,然後初始值是 undefined。
這一切只要跑下列語法就會被揭穿 :
for(i in _root){
trace(i);
}
從跑的結果中會發現原本的btn根本沒被移除啊~它還躲在某個地方繼續偷吃記憶體…
不過這到提醒我要用flash player 8試試,既然它宣稱是用 full collection做GC,那當 btn = undefind 或 delete btn被執行時,它就應該乖乖移掉這個reference…嗯 等試完再來寫結果。
4. 小布&hellip | August 30th, 2005 at 5:58 pm
可素…有時用Button元件來作..挺好用的溜~
像SKIP、REPLAY、ENTER..哈哈哈@@
Trackback this post | Subscribe to the comments via RSS Feed