AS3程序優化

最近我在整理以前的AS1,AS2代碼的時候,發現了很多好玩的小DEMO。不過在我改成AS3之後,性能並不是讓我很滿意,AS3很完整,很程序化,不 過在一些性能方面,如果你沒有及時釋放掉內存,可能會跑的比AS2來編寫的還慢,很奇怪吧。不過在Flash Player 10推出之後,有一個對性能極大有幫助的命令很重要,就是:Vector,感興趣的,可以打開幫助文檔好好看看,不過我今天並不是要講這個。
我也是剛看到Armand Niculescu 的AS3 Performance Optimization的這篇文章,才隨機寫寫。在我之前有篇文章寫過對於全選數組的方法,怎麼樣纔是最好。同時我順便把他的文章,重要的一些方式提出來,放在自己的BLOG,同時也是給自己做個資料備份。
我個人認爲,一款程序的性能高與低,完全是在於程序員的寫代碼的方法,雖然我提倡的很自由的代碼寫作方法,不過,在需要耗費大量CPU性能的地方,還是需要按照嚴格的:命令的規範,變量定義的規範等等。特別是你如果已經知道某個變量大概的範圍,比如是int類型的,就不要偷懶搞成Number類型。
比如把偷懶的一長句改成勤勞的幾個小短句

寫成 

這樣的做法,是對性能是有非常大的幫助的,再比如,我們已經知道一個數組(Array),裏面包含的全都是Object.那麼需要知道每個Object.id的話,這樣寫

需要改寫成下面的格式就會好點

你可以注意到,這些所謂的性能優化,就是一個要點,把"簡單"的寫法寫的"複雜"了。不過這是一個好習慣,對你的程序的性能優化也是有非常大的幫助的。當然這些的優化將會在你使用一千次,或者上萬次就會體現出來了。
在一些算法上,儘量用自己寫的構造函數,比如那篇文章裏提到了比較兩個數大小的構造函數,一般人偷懶就直接來:

這個很簡單,我也很喜歡,如果不是自己去寫一些變態的運算法則,我一般都是這麼寫的。不過,不過,個人建議還是這個好:

簡直好太多了,對於這種寫法在辨別條件語句的時候,是非常好的。
同時也要注意了,數組的一些語句並不好用,比如push(), pop(), shift() or unshift(); 當然這些性能上的優越也是在大量的運算下才會體現出來,如果你是那種力求完美的傢伙,就該改用自己寫的構造函數。
當然如果你足夠變態,像下面的語句改寫:

寫成

呵呵,這個就過於煩瑣了,一不小心還會搞錯。起碼我是不會用。還有其他的方法都可以去看看裏面的文章,不過我一般用以上幾個,其他的過於煩瑣,就懶的用了,除非真的碰到上萬個,極端誇張的運算方式。下面就來說下怎麼搞定上萬,不,就上千個圖標的排列吧。
我們試想一種情況(當然,本人是絕對反對這種方式的),我們在點擊某個點,然後“蹦”的跳出來上千個細小的圖標。然後在屏幕上晃啊晃的。如果你寫成 MovieClip,Sprite,Shape等等,甚至你開啓了cacheAsBitmap爲true,我保證,你的電腦絕對會卡死你(當然,如果讓你老闆看到了也是不錯的,你看,我的電腦很破舊了,該升級了)。那麼我們該如何解決這個呢。
第一,不要那麼多的細小的圖標,換成50個,50個的來。這是我比較提倡的方式,畢竟操作者誰也不喜歡滿屏幕都在晃。
第二,化你的MovieClip也好,Sprite也好,Shape也好,通通搞成Bitmap。明白了吧,而且你如果刪除Bitmap的話,還可以用dispose(),命令清空內存。
那麼,你肯定會說,我在舞臺上addChild一個Sprite,然後再removeChild,是否會清空掉內存呢?很遺憾,不會。不過在我兩個多小時無聊的測試中,我發現,只要你在後期removeChild後,雖然內存未清空,在不停的運算中,不停的增長,但是到了一定的階段,他就STOP 了,WHY?我不知道。不過哪怕就算是這樣,內存佔用的狀況還是不容樂觀。所以改寫成Bitmap,就是最好的方式。 那怎麼做?
先期,你addChild一個Bitmap後,在後面不需要的時候,在removeChild之前,加上Bitmap.bitmapData.dispose();和Bitmap.bitmapData=null; 這個很重要。
差點忘了也是很重要的一個,就是記得要removeAddEventListener。監聽事件如果不需要了,就一定要remove掉。特別是EnterFrame事件。
頭暈了沒?我想你已經暈了,性能優化一般都是源於良好的寫作習慣,和追求完美的精神。在FLASH上,你就需要做到:
體積能小就小,
性能能快就快,
界面能簡潔就簡潔,
組件能不用就不用,
圖片能用畫就畫。
其他的暫時沒想到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章