as3的幾個優(yōu)化技巧_第1頁
as3的幾個優(yōu)化技巧_第2頁
as3的幾個優(yōu)化技巧_第3頁
as3的幾個優(yōu)化技巧_第4頁
as3的幾個優(yōu)化技巧_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第一章 AS3的一些優(yōu)化計算方法 用乘法來代替除法(當(dāng)除數(shù)可轉(zhuǎn)化為有限數(shù)的時候)。比如var n:Number = value * 0.5;要比var n:Number = value / 2;快。但差別并不是很大。只有在需要大量計算情況下,比如3D引擎中差別才比較明顯。 用位運算代替除2或乘2。比如10>>1要比10*2快,而10<<1要比10*2快。從測試來看位運算幾乎比乘除快一倍,但是一般情況下,我們不能選擇位運算,比如我們就不能用13>>1來代替13/2,盡管前者比后者運算速度更快,但2者的運算結(jié)果卻不一樣。所以還是要看具體情況。 用unit(或in

2、t(代替取整運算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(更快。 用乘-1來代替Math.abs(方法。比如var nn:Number = -23;var test:Number= n

3、n < 0 ? nn * -1 : nn;要比var nn:Number = -23;var test:Number = Math.abs(nn;快。當(dāng)然還有更多的優(yōu)化計算的方法。一般來說,低級運算要比高級運算速度;內(nèi)部方法比調(diào)用其他方法速度快。另外要注意的是,這些方法有的時候可能并一定適用。 第二章 Actionscript 優(yōu)化指南 原著 Marco Lapi,alias Lapo, aw譯 在這篇文章中,我們將討論多種優(yōu)化 Actionscript 代碼的方法.此外我們也針對一些典型的游戲代碼進行了系列測試,來最大限度的發(fā)掘、提高Flash播放器的性能。何時進行優(yōu)化對現(xiàn)有程序進行優(yōu)

4、化的過程,有時十分的冗長與困難,這與原始代碼的非優(yōu)化程度有關(guān),所以在投入大量時間進行代碼優(yōu)化之前,最重要的是要估計出要在什么地方對代碼做出修改或替換。 一個游戲代碼的最重要的部分就是主循環(huán)體,通常情況下該循環(huán)體要在flash的每一幀上執(zhí)行,并控制游戲中的角色屬性和重要的數(shù)據(jù)參數(shù)。而對于主循環(huán)體以外的部分,也可能是次要循環(huán)部分,同樣要注意是給其否分配了過多的資源,而沒有分配給那些更需要資源的核心部分。 通過積累在各處節(jié)約出來的時間(可能每處僅僅是幾個毫秒,您會明顯發(fā)現(xiàn)自己的swf運行得更加穩(wěn)定,并且游戲感也大大加強。 簡潔與高效的代碼 書寫出十分簡潔、可以再次調(diào)用的代碼(有時可能是面向?qū)ο蟮氖且?/p>

5、項精細(xì)的工作,但這需要多年的編程經(jīng)驗。對于OOP(object oriented programming,面向?qū)ο蟮某绦蛟O(shè)計,有些場合根本利用不到它的優(yōu)勢,這使得它顯得十分奢侈。在有限的資源條件下(可能是flash播放器的原因,通過更先進的方法,像剛剛提到的OOP,就可能反而導(dǎo)致令人不滿意的結(jié)果。 我們并不是說OOP對游戲編程不好 ,只是在某些場合它顯得過于奢侈和多余。畢竟有時候“傳統(tǒng)的方法”卻能得到更好的結(jié)果。大體而言,用OOP是比較好的,因為它讓代碼維護更加簡單。但在后文中,你會看到有時為了充分發(fā)揮flashplayer性能,而不采用OOP技術(shù)。例如:處理快速滾動或者計算十分復(fù)雜的數(shù)學(xué)問題

6、?;镜膬?yōu)化一提及代碼優(yōu)化,我們馬上會聯(lián)想到執(zhí)行速度的改進,而很少去考慮系統(tǒng)資源的分配。這是因為當(dāng)今,即使是將被淘汰的計算機,都有足夠的內(nèi)存來運行我們大部分的flash游戲(128M的內(nèi)存足以滿足大多數(shù)情況的需要,況且,512M的內(nèi)存是當(dāng)今新電腦的基本配置 變量 在各種重要的代碼優(yōu)化手段中,有這么一條:在定義局部變量的時候,一定要用關(guān)鍵字var來定義,因為在Flash播放器中,局部變量的運行速度更快,而且在他們的作用域外是不耗占系統(tǒng)資源的。 aw附:var變量僅僅在花括號對中才有“生命”,個人認(rèn)為沒有系統(tǒng)學(xué)過編程的人容易出錯的一個地方: awMC.onLoad = function( var

7、aw = 1; awMC.onEnterFrame = function( /不存在aw這個變量 一段非優(yōu)化代碼: function doSomething( mx = 100 my = 100 ar = new Array( for (y=0; y < my; y+ for (x=0; x < mx; x+ i = (y * mx + x arri = i return arr 這段代碼中,并未聲明函數(shù)體內(nèi)的那些變量(那些僅僅在函數(shù)內(nèi)使用的變量為局部變量,這使得這些變量被播放器調(diào)用的速度更慢,并且在函數(shù)執(zhí)行完畢的時候仍然耗占系統(tǒng)資源。 下面列出的是經(jīng)過改進的同樣功能的代碼: fu

8、nction doSomething( var mx = 100 var my = 100 var ar = new Array( for (var y=0; y < my; y+ for (var x=0; x < mx; x+ var i = (y * mx + x arri = i return arr 這樣一來所有的變量均被定義為了局部變量,他們能夠更快地被播放器調(diào)用。這一點在函數(shù)大量(10,000次循環(huán)運行時顯得尤為重要!當(dāng)一個函數(shù)調(diào)用結(jié)束的時候,相應(yīng)的局部變量都會被銷毀,并且釋放出他們占有的系統(tǒng)資源。 onEnterFrame 事件 onEnterFrame事件對于游戲

9、開發(fā)者而言是非常有用的,它使得我們能夠快速、反復(fù)地按照預(yù)設(shè)幀頻(fps運行一段程序?;叵朐贔lash5的時代,這(onEnterFrame實時監(jiān)控是一種非常流行的技術(shù),用這樣的事件來控制機器游戲?qū)κ值倪壿嫞只蛘呶覀兛梢栽诿恳粋€子彈上設(shè)置這樣的事件來監(jiān)測子彈的碰撞。 實際上,我們并不推薦給過多的MoveClip添加這樣的事件,因為這樣做會導(dǎo)致“無頭緒碼(spaghetti code”的出現(xiàn),并且容易導(dǎo)致程序效率明顯降低。 大多數(shù)情況下,用單獨一個onEnterFrame事件就可以解決問題了:用這一個主循環(huán)來執(zhí)行你所 需要的操作。 另一個簡單的辦法是設(shè)置一個合適的幀頻:要知道幀頻越高,CPU資源

10、就越緊張。在幀頻為25-35(fps之間時,onEnterFrame足以很好地執(zhí)行較復(fù)雜代碼,哪怕你的計算機配置較低。因此,在沒有特殊要求的場合,我們不推薦使用高于60(fps的幀頻。 矢量圖與位圖 在處理圖形前,我們一定要做出正確的選擇。Flash能對矢量圖和位圖進行完美的兼容,然而矢量圖和位圖在播放器中的表現(xiàn)實質(zhì)卻完全不同。在用到矢量圖的時候,我們要盡可能簡化它們的形狀,去除多余的端點。這樣做將大大降低播放器用于呈現(xiàn)矢量圖所要進行的計算量。另一個重要方面在于線條的運用,盡量減少和避免冗陳的線條結(jié)構(gòu),因為它們會直接影響到flash的播放效率。 當(dāng)某個實例透明度小于100時,也會對播放速率造成

11、影響,所以如果你發(fā)現(xiàn)自己的Flash播放速率過慢,就去挑出這些透明的實例來吧! 那么,如果真的需要呈現(xiàn)比較復(fù)雜的場景時,你就最好考慮使用位圖實現(xiàn)。雖然Flash在對位圖的渲染效率上并不是最優(yōu)越的(比如和Flash的“兄長”Director比起來,但豐富的視覺內(nèi)容呈現(xiàn)只能靠位圖(與位圖同復(fù)雜度的矢量圖形渲染速率非常低了,這也是很多基于區(qū)塊的游戲中廣泛采用像素圖作為背景的原因。順便要提到的是,F(xiàn)lash雖然對GIF,JPG和PNG都有所支持,但是渲染速度上PNG還是占有絕對優(yōu)勢,所 以我們建議flash中的位圖都盡可能采用PNG格式。 影片剪輯(MovieClip的可視性下面將MovieClip簡

12、稱為mc 您可能會經(jīng)常碰到這樣一種情況:有大量不可見/屏幕外的mc等待出場(比如游戲中屏幕外的地圖、人物等等。 要知道,播放器仍然要消耗一定的資源來處理這些不可見/屏幕外的mc,哪怕他們是單幀,非播放的狀態(tài)。 最好的解決辦法之一是給這些mc一個空白幀,當(dāng)他們不出現(xiàn)在屏幕上時,你能用gotoAndStop(語句跳轉(zhuǎn)到這一幀,從而減少播放器對資源的需求。 請務(wù)必記住,這種情況下,簡單的設(shè)置可見度屬性為不可見( _visible = false 是無效的,播放器將繼續(xù)按照這些mc所停留或播放的幀的復(fù)雜度來分配資源。 數(shù)組 數(shù)組在各種需要記錄數(shù)據(jù)的應(yīng)用程序和游戲中都被廣泛的使用。 一個典型的例子就是基

13、于區(qū)塊的Flash游戲,在這樣一類的游戲中,地圖有時被存放成形如arryx的二維數(shù)組。雖然這是一種很常見的方法,但是如果用一維數(shù)組的話,卻能提高程序的運行效率。另一個重要的方法來提高數(shù)組效率是在數(shù)組遍歷的時候使用for in 循環(huán)來代替?zhèn)鹘y(tǒng)的 for 或者while循環(huán)語法。 例如: 一段代碼如下 for (var i in arr if (arri > 50 / 進行某些操作 它的執(zhí)行速度明顯高于這一段代碼: for (var i=0; i < 10000; i+ if (arri > 50 / 進行某些操作 前者的效率比后者提高了30%,這個數(shù)字在你的游戲要逐幀執(zhí)行這一段

14、代碼的時候顯得更加寶貴! 高級優(yōu)化: 1 for循環(huán) 和 while循環(huán) 用while循環(huán)將會得到比for循環(huán)更好的效率。然而,從數(shù)組中讀取數(shù)據(jù),用for in循環(huán)式最好的選擇! 所以我們不推薦使用: for (var i=0; i < 1000; i+ /進行某些操作 而推薦使用 var i=-1 while (+i < 1000 /進行某些操作 2 從數(shù)組中讀取數(shù)據(jù) 我們通過測試發(fā)現(xiàn),for in循環(huán)的效率大大高于其他的循環(huán)方式。參看: arr = MAX = 5000 /數(shù)組賦值 for (i=0; i < MAX; i+ arri = i var item = nul

15、l / For 循環(huán) for (var i=0; i < MAX; i+ item = arri / For 循環(huán) for (var i in arr item = arri / While 循環(huán) i = -1 while(+i < MAX item = arri 3 向數(shù)組中寫入數(shù)據(jù)(while , for可以看到while循環(huán)稍占優(yōu)勢。 4 _global(全局變量同Timeline(時間軸變量 我們猜測采用全局變量能提高變量調(diào)用速度,然而效果并不像預(yù)計的那樣明顯。 5 單行、多行變量賦值 我們發(fā)現(xiàn)單行變量賦值效率大大高于多行。比如: a = 0 b = 0 c = 0 d =

16、 100 e = 100 效率就不如: a = b = c = 0 d = e = 100 6 變量名尋址 這個測試反映了變量名的預(yù)尋址是非常重要的,尤其是在循環(huán)的時候,一定要先給丁一個指向。這樣大大節(jié)約了尋址時間。 比如: var num = null t = getTimer( for (var i=0; i < MAX; i+ num = Math.floor(MAX Math.ceil(MAX t1.text = “Always lookup: ” + (getTimer( t 就不如: t = getTimer( var floor = Math.floor var ceil

17、= Math.ceil for (var i=0; i < MAX; i+ num = floor(MAX ceil(MAX 7 短變量名和長變量名 變量名越短,效率越高??紤]到長變量名也有它的好處(比如,便于維護等),因此建議在關(guān)鍵部位(比如大量循環(huán)出現(xiàn)的時候)使用短變量名,最好就1-2個字符。 8 循環(huán)前、后聲明變量 在測試前,我們認(rèn)為循環(huán)前聲明變量會更加節(jié)約時間,不料測試結(jié)果并不明顯,甚至還恰恰相反! / 內(nèi)部聲明 t = getTimer( for (var i=0; i < MAX; i+ var test1 = i t1.text = “Inside:” + (getT

18、imer( t / 外部聲明 t = getTimer( var test2 for (var i=0; i < MAX; i+ test2 = i 9 使用嵌套的if結(jié)構(gòu) 當(dāng)用到復(fù)雜的條件表達式時。把他們打散成為嵌套的獨立判斷結(jié)構(gòu)是最佳方案。下面的代碼我們進行了測試,發(fā)現(xià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 /下面的

19、判 斷更加節(jié)省時間 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)勢! 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 func

20、tion 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)聽鍵盤事件 同剛才所提到的尋址一樣,我們實現(xiàn)給一個指向會得到更好的效率,比如: keyDown = Key.isDown

21、 keyLeft = Key.LEFT /我們再用 if (keyDown(keyLeft 附:我們測試了按鍵代碼和鍵值常量的效率發(fā)現(xiàn)并無太大差別。 12 Math.floor(方法與int( 這個問題曾在Flashkit的論壇被提出討論過。測試表明,舊的int方法反而效率更高。我們的測試結(jié)果也反映了這一點。 13eval表達式與中括號語法 我們并沒有發(fā)現(xiàn)明顯的差別,并不像剛才所述那樣,舊的eval表達式比起中括號方法并沒有太大的優(yōu)勢 var mc = eval(“_root.myMc” + i var mc = _root"myMc" + i /兩者效率差不多16 涉及M

22、C的循環(huán):ASBroadcaster 同歡同循環(huán)的差別 結(jié)論 我們從這些測試結(jié)果中發(fā)現(xiàn),對于不同的需求,采用不同的代碼,我們可以大大提高腳本的執(zhí)行效率。雖然我們在這里羅列了許多的優(yōu)化代碼的方法,需要大家自己測試、實驗的還有很多(考慮到每個人的需求不同.如果你想更加深入地討論這類問題??梢詠砦覀兊恼搲?。 aw附: 終于翻譯完了,自己也學(xué)到很多好東西,大家又什么問題可以去gotoAndPlay的官方,也可以來我的Blog提出! 第三章 黑羽AS心得:淺釋ActionScript的代碼優(yōu)化 本機函數(shù)要比用戶定義的函數(shù)運行速度更快。本機函數(shù)即Flash中內(nèi)有的一些函數(shù)(intrinsic,比如hitT

23、est(,你沒必要自己寫一個類似的。 3.不要過多使用 Object 類型。 數(shù)據(jù)類型注釋應(yīng)力求精確,這樣可以提高性能。只有在沒有適當(dā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變量,會被放入寄存器使用,效率遠(yuǎn)比訪問Array再得到length高。例如,應(yīng)使用 var fontArr:Ar

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論