7) 短變量名和長(zhǎng)變量名 變量名越短,效率越高?紤]到長(zhǎng)變量名也有它的好處(比如,便于維護(hù)等),因此建議在關(guān)鍵部位(比如大量循環(huán)出現(xiàn)的時(shí)候)使用短變量名,最好就1-2個(gè)字符。
8) 循環(huán)前、后聲明變量 在測(cè)試前,我們認(rèn)為循環(huán)前聲明變量會(huì)更加節(jié)約時(shí)間,不料測(cè)試結(jié)果并不明顯,甚至還恰恰相反!
// 內(nèi)部聲明 t = getTimer() for (var i=0; i < MAX; i++) { var test1 = i } t1.text = "Inside:" + (getTimer() - t) // 外部聲明 t = getTimer() var test2 for (var i=0; i < MAX; i++) { test2 = i }
9) 使用嵌套的if結(jié)構(gòu) 當(dāng)用到復(fù)雜的條件表達(dá)式時(shí)。把他們打散成為嵌套的獨(dú)立判斷結(jié)構(gòu)是最佳方案。下面的代碼我們進(jìn)行了測(cè)試,發(fā)現(xiàn)這種效果改進(jìn)明顯!
MAX = 20000 a = 1 b = 2 c = -3 d = 4 var i=MAX while(--i > -1) { if (a == 1 && b == 2 && c == 3 && d == 4) { var k = d * c * b * a } } //下面的判斷更加節(jié)省時(shí)間 var i=MAX while(--i > -1) { if (a == 1) { if (b == 2) { if (c == 3) { if (d == 4) { var k = d * c * b * a } } } } }
10) 尋找局部變量(this方法同with方法比較) 局部變量的定位方法很多。我們發(fā)現(xiàn)用with比用this更加有優(yōu)勢(shì)!
obj = {} obj.a = 1 obj.b = 2 obj.c = 3 obj.d = 4 obj.e = 5 obj.f = 6 obj.g = 7 obj.h = 8 obj.test1 = useThis obj.test2 = useWith MAX = 10000 function useThis() { var i = MAX while(--i > -1) { this.a = 1 this.b = 2 this.c = 3 this.d = 4 this.e = 5 this.f = 6 this.g = 7 this.h = 8 } } function useWith() { var i = MAX while(--i > -1) { with(this) { a = 1 b = 2 c = 3 d = 4 e = 5 f = 6 g = 7 h = 8 } } }
11) 循環(huán)監(jiān)聽鍵盤事件 同剛才所提到的尋址一樣,我們實(shí)現(xiàn)給一個(gè)指向會(huì)得到更好的效率,比如:
keyDown = Key.isDown keyLeft = Key.LEFT
//我們?cè)儆?if (keyDown(keyLeft)) 附:我們測(cè)試了按鍵代碼和鍵值常量的效率發(fā)現(xiàn)并無(wú)太大差別。
12) Math.floor()方法與int() 這個(gè)問(wèn)題曾在Flashkit的論壇被提出討論過(guò)。測(cè)試表明,舊的int方法反而效率更高。我們的測(cè)試結(jié)果也反映了這一點(diǎn)。
13)eval表達(dá)式與中括號(hào)語(yǔ)法 我們并沒(méi)有發(fā)現(xiàn)明顯的差別,并不像剛才所述那樣,舊的eval表達(dá)式比起中括號(hào)方法并沒(méi)有太大的優(yōu)勢(shì) var mc = eval("_root.myMc" + i) var mc = _root["myMc" + i] //兩者效率差不多16) 涉及MC的循環(huán):ASBroadcaster 同歡同循環(huán)的差別
結(jié)論
我們從這些測(cè)試結(jié)果中發(fā)現(xiàn),對(duì)于不同的需求,采用不同的代碼,我們可以大大提高腳本的執(zhí)行效率。雖然我們?cè)谶@里羅列了許多的優(yōu)化代碼的方法,需要大家自己測(cè)試、實(shí)驗(yàn)的還有很多(考慮到每個(gè)人的需求不同).如果你想更加深入地討論這類問(wèn)題?梢詠(lái)我們的論壇。
aw附: 終于翻譯完了,自己也學(xué)到很多好東西,大家又什么問(wèn)題可以去gotoAndPlay的官方,也可以來(lái)我的Blog提出!
第三章 黑羽AS心得:淺釋ActionScript的代碼優(yōu)化
本機(jī)函數(shù)要比用戶定義的函數(shù)運(yùn)行速度更快。本機(jī)函數(shù)即Flash中內(nèi)有的一些函數(shù)(intrinsic),比如hitTest(),你沒(méi)必要自己寫一個(gè)類似的。
3.不要過(guò)多使用 Object 類型。 數(shù)據(jù)類型注釋應(yīng)力求精確,這樣可以提高性能。只有在沒(méi)有適當(dāng)?shù)膫溥x數(shù)據(jù)類型時(shí),才使用 Object 類型。同時(shí)也便于代碼管理,時(shí)刻知道對(duì)象的類型和作用。同時(shí)也有利于編譯器編譯時(shí)優(yōu)化。
4.避免使用 eval() 函數(shù)或數(shù)據(jù)訪問(wèn)運(yùn)算符。 通常,較為可取且更有效的做法是只設(shè)置一次局部引用。不得已時(shí)才用eval,比如轉(zhuǎn)換_droptarget為MovieClip時(shí)。
5.在開始循環(huán)前將 Array.length 賦予變量,尤其是大的循環(huán)。 在開始循環(huán)前將 Array.length 賦予變量(比如var iLength:Number),將其作為條件使用,而不是使用myArr.length 本身。 原因,在循環(huán)中,iLength是Number變量,會(huì)被放入寄存器使用,效率遠(yuǎn)比訪問(wèn)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]); }
來(lái)代替:
var fontArr:Array = TextField.getFontList(); for (var i:Number = 0; i < fontArr.length; i++) { trace(fontArr[i]); }
6.注重優(yōu)化循環(huán)及所有重復(fù)動(dòng)作。 Flash Player 花費(fèi)許多時(shí)間來(lái)處理循環(huán)(如使用 setInterval() 函數(shù)的循環(huán))。
7.在局部變量夠用時(shí),不要使用全局變量。類靜態(tài)變量也要少用。 全局變量是開發(fā)者的惡夢(mèng)。實(shí)在需要全局變量的話,我建議使用singleton設(shè)計(jì)模式來(lái)進(jìn)行管理。
8.聲明變量時(shí),添加 var 關(guān)鍵字。 這是為了編譯時(shí)讓編譯器知道你的變量類型,優(yōu)化編譯。
黑羽補(bǔ)充一點(diǎn):對(duì)關(guān)鍵字的使用要謹(jǐn)慎。 不贊成使用關(guān)鍵字作為自己的method和屬性名,除非你確認(rèn)后續(xù)開發(fā)不會(huì)用到相同的事件名和屬性名。 但你怎么知道flash使用了多少隱藏關(guān)鍵字?太多了!比如說(shuō) className, invalidate, refresh, mouseOver等等不常用的關(guān)鍵詞。好的方法是使用SEPY編輯器來(lái)寫代碼,那里面加亮了所有公布的和沒(méi)有公布的關(guān)鍵詞。而且因?yàn)楹苡锌赡芎蛃tart,load,等這些常用的事件名重復(fù),帶來(lái)代碼不必要的修改和麻煩。
9.對(duì)涉及到調(diào)用繪圖資源的函數(shù)時(shí),盡量先多判斷再調(diào)用。 所有漸變,位置變化,創(chuàng)建刪除MC,組件等函數(shù)都涉及到繪圖資源的調(diào)用。在很多情況下,盡量先用邏輯判斷變量或者對(duì)象的屬性,必要時(shí)再調(diào)用這些函數(shù)。這樣可以節(jié)省較多的計(jì)算資源。
經(jīng)典論壇交流: http://bbs.blueidea.com/thread-2864272-1-1.html
本文鏈接:http://www.95time.cn/tech/multimedia/2008/6158.asp
出處:相關(guān)論壇
責(zé)任編輯:bluehearts
上一頁(yè) FLASH程序優(yōu)化 [3] 下一頁(yè)
◎進(jìn)入論壇RIA設(shè)計(jì)與應(yīng)用版塊參加討論
|