本文既為淺談代碼優(yōu)化,那么就不深入到OOP設(shè)計層面。僅涉及Flash8幫助里面提到的一些代碼編寫優(yōu)化原則,并加以解釋。
準則來源于Flash8 幫助,我做了一些解釋:
1.避免從一個循環(huán)中多次調(diào)用一個函數(shù)。 在循環(huán)中包含小函數(shù)的內(nèi)容,可使效果更佳。小函數(shù)生命期短,利于資源釋放。尤其是在大的循環(huán)中時。
2.盡可能使用本機函數(shù)。 本機函數(shù)要比用戶定義的函數(shù)運行速度更快。本機函數(shù)即Flash中內(nèi)有的一些函數(shù)(intrinsic),比如hitTest(),你沒必要自己寫一個類似的。
3.不要過多使用 Object 類型。 數(shù)據(jù)類型注釋應(yīng)力求精確,這樣可以提高性能。只有在沒有適當?shù)膫溥x數(shù)據(jù)類型時,才使用 Object 類型。同時也便于代碼管理,時刻知道對象的類型和作用。 同時也有利于編譯器編譯時優(yōu)化。
4.避免使用 eval() 函數(shù)或數(shù)據(jù)訪問運算符。 通常,較為可取且更有效的做法是只設(shè)置一次局部引用。不得已時才用eval,比如轉(zhuǎn)換_droptarget為MovieClip時。
5.在開始循環(huán)前將 Array.length 賦予變量,尤其是大的循環(huán)。 在開始循環(huán)前將 Array.length 賦予變量(比如var iLength:Number),將其作為條件使用,而不是使用 myArr.length 本身。 原因,在循環(huán)中,iLength是Number變量,會被放入寄存器使用,效率遠比訪問Array再得到length高。例如,應(yīng)使用
var fontArr:Array = TextField.getFontList(); var arrayLen:Number = fontArr.length; for (var i:Number = 0; i < arrayLen; i++) { trace(fontArr[i]); }
來代替:
var fontArr:Array = TextField.getFontList(); for (var i:Number = 0; i < fontArr.length; i++) { trace(fontArr[i]); }
6.注重優(yōu)化循環(huán)及所有重復(fù)動作。 Flash Player 花費許多時間來處理循環(huán)(如使用 setInterval() 函數(shù)的循環(huán))。
7.在局部變量夠用時,不要使用全局變量。 類靜態(tài)變量也要少用。 全局變量是開發(fā)者的惡夢。實在需要全局變量的話,我建議使用singleton設(shè)計模式來進行管理。
8.聲明變量時,添加 var 關(guān)鍵字。 這是為了編譯時讓編譯器知道你的變量類型,優(yōu)化編譯。
黑羽補充兩點:
1、對關(guān)鍵字的使用要謹慎。 不贊成使用關(guān)鍵字作為自己的method和屬性名,除非你確認后續(xù)開發(fā)不會用到相同的事件名和屬性名。 但你怎么知道flash使用了多少隱藏關(guān)鍵字?太多了!比如說 className, invalidate, refresh, mouseOver等等不常用的關(guān)鍵詞。好的方法是使用SEPY編輯器來寫代碼,那里面加亮了所有公布的和沒有公布的關(guān)鍵詞。 而且因為很有可能和start,load,等這些常用的事件名重復(fù),帶來代碼不必要的修改和麻煩。
2、對涉及到調(diào)用繪圖資源的函數(shù)時,盡量先多判斷再調(diào)用。 所有漸變,位置變化,創(chuàng)建刪除MC,組件等函數(shù)都涉及到繪圖資源的調(diào)用。在很多情況下,盡量先用邏輯判斷變量或者對象的屬性,必要時再調(diào)用這些函數(shù)。這樣可以節(jié)省較多的計算資源
出處:藍色理想
責(zé)任編輯:moby
◎進入論壇Flash專欄版塊參加討論
|