AS代碼優化

不得不承認 在flash強大的表現力下 性能損耗始終是很麻煩的一個問題。下面羅列一些自己常用的一些技巧和一些網上收集的技巧。拋磚引玉,希望大家都能來討論下自己在flash程序優化方面的一些經驗。

OK,直接開始

1、在局部變量夠用時,不要使用全局變量。類靜態變量也要少用。全局變量是開發者的惡夢。實在需要全局變量的話,我建議使用singleton設計模式來進行管理。


2、讀取數組中的數據,儘量使用for in 循環來代替傳統的 for 或者while循環語法。
因爲for in的執行效率比起後者提高了30%。其次是選擇while循環,傳統for循環語法的效率在三者中是最低的。
向數組中寫入數據,則是while循環稍佔優勢。


3、給所有的MovieClip都多加一個空白幀,當他們不出現在屏幕上時,你能用gotoAndStop()語句跳轉到這一幀。爲什麼呢?因爲播放器仍然要消耗一定的資源來處理這些不可見/屏幕外的mc,哪怕他們是單幀,非播放的狀態。簡單的設置可見度屬性爲不可見( _visible = false )是無效的,播放器依然會按照這些MC說停留或播放的幀的複雜度來分配資源。


4、能用單行賦值則使用單行賦值。比如:
a = 0
b = 0
c = 0
效率就不如:
a = b = c = 0


5、變量名越短,效率越高。考慮到長變量名也有它的好處(比如,便於維護等),因此建議在關鍵部位(比如大量循環出現的時候)使用短變量名,最好就1-2個字符。


6、不要過多使用 Object 類型。 數據類型註釋應力求精確,這樣可以提高性能。只有在沒有適當的備選數據類型時,才使用 Object 類型。同時也便於代碼管理,時刻知道對象的類型和作用。同時也有利於編譯器編譯時優化。


7、避免使用 eval() 函數或數據訪問運算符。 通常,較爲可取且更有效的做法是隻設置一次局部引用。不得已時才用eval,比如轉換_droptarget爲MovieClip時。


8、在開始循環前將 Array.length 賦予變量,尤其是大的循環。 在開始循環前將 Array.length 賦予變量(比如var iLength:Number),將其作爲條件使用,而不是使用myArr.length 本身。原因,在循環中,iLength是Number變量,會被放入寄存器使用,效率遠比訪問Array再得到length高。


9、當用到複雜的條件表達式時。把他們打散成爲嵌套的獨立判斷結構是最佳方案。比如if(a&&b&&c)的效率就低於if(a){if(b){if(c){}}}。當然這樣做代碼是會比較不美觀。


10、在用到矢量圖的時候,我們要儘可能簡化它們的形狀,去除多餘的端點。這樣做將大大降低播放器用於呈現矢量圖所要進行的計算量。


11、需要呈現比較複雜的場景時,你就最好考慮使用位圖實現。
雖然Flash在對位圖的渲染效率上並不是最優越的(比如和Flash的“兄長”Director比起來),但豐富的視覺內容呈現只能靠位圖(與位圖同複雜度的矢量圖形渲染速率非常低)了,這也是很多基於區塊的遊戲中廣泛採用像素圖作爲背景的原因。
順便要提到的是,Flash雖然對GIF,JPG和PNG都有所支持,但是渲染速度上PNG還是佔有絕對優勢,所以建議flash中的位圖都儘可能採用PNG格式。


12、運用線條時,儘量減少和避免冗陳的線條結構,因爲它們會直接影響到flash的播放效率。


13、當某個實例透明度小於1時,也會對播放速率造成影響。


14、儘量使用單獨一個onEnterFrame事件,因爲如果給過多的MoveClip添加這樣的事件,很可能會導致“無頭緒碼(spaghetti code)”的出現,並且容易導致程序效率明顯下降。


15、用乘-1來代替Math.abs()方法。比如
var nn:Number = -23;
var test:Number= nn < 0 ? nn * -1 : nn;
要比
var nn:Number = -23;
var test:Number = Math.abs(nn);快。
當然還有更多的優化計算的方法。一般來說,低級運算要比高級運算速度;內部方法比調用其他方法速度快。
另外要注意的是,這些方法有的時候可能並一定適用。


16、用unit()或int()代替取整運算Math.floor()和Math.ceil()。比如
var test:uint = uint(1.5);
要比
var test:Number = Math.floor(1.5);快;
而var test:uint = uint(1.5)+1;
要比var test:Number = Math.ceil(1.5);也快。
如果是Math.floor(),還可以用位運算(>>0)來代替。比如
var test:uint =1.5>>0,比unit()或int()更快。


17、用位運算代替除2或乘2。比如10>>1要比10*2快,而10<<1要比10*2快。
從測試來看位運算幾乎比乘除快一倍,但是一般情況下,我們不能選擇位運算,比如我們就不能用13>>1來代替13/2,儘管前者比後者運算速度更快,但2者的運算結果卻不一樣。所以還是要看具體情況。


18、用乘法來代替除法(當除數可轉化爲有限數的時候)。比如
var n:Number = value * 0.5;
要比
var n:Number = value / 2;快。
但差別並不是很大。只有在需要大量計算情況下,比如3D引擎中差別才比較明顯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章