




免費(fèi)預(yù)覽已結(jié)束,剩余12頁(yè)可下載查看
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ActionScript3.0代碼優(yōu)化技巧第一章 AS3的一些優(yōu)化計(jì)算方法1.用乘法來(lái)代替除法(當(dāng)除數(shù)可轉(zhuǎn)化為有限數(shù)的時(shí)候)比如var n:Number = value * 0.5;要比var n:Number = value / 2;快。但差別并不是很大。只有在需要大量計(jì)算情況下,比如3D引擎中差別才比較明顯。2.用位運(yùn)算代替除2或乘2比如101要比10*2快,而101來(lái)代替13/2,盡管前者比后者運(yùn)算速度更快,但2者的運(yùn)算結(jié)果卻不一樣。所以還是要看具體情況。3.用unit()或int()代替取整運(yùn)算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(),還可以用位運(yùn)算(0)來(lái)代替。比如var test:uint =1.50,比unit()或int()更快。4.用乘-1來(lái)代替Math.abs()方法比如var nn:Number = -23;var test:Number= nn 0 ? nn * -1 : nn;要比var nn:Number = -23;var test:Number = Math.abs(nn);快。當(dāng)然還有更多的優(yōu)化計(jì)算的方法。一般來(lái)說(shuō),低級(jí)運(yùn)算要比高級(jí)運(yùn)算速度;內(nèi)部方法比調(diào)用其他方法速度快。另外要注意的是,這些方法有的時(shí)候可能并一定適用。第二章 Actionscript 優(yōu)化指南何時(shí)進(jìn)行優(yōu)化對(duì)現(xiàn)有程序進(jìn)行優(yōu)化的過(guò)程,有時(shí)十分的冗長(zhǎng)與困難,這與原始代碼的非優(yōu)化程度有關(guān),所以在投入大量時(shí)間進(jìn)行代碼優(yōu)化之前,最重要的是要估計(jì)出要在什么地方對(duì)代碼做出修改或替換。一個(gè)游戲代碼的最重要的部分就是主循環(huán)體,通常情況下該循環(huán)體要在flash的每一幀上執(zhí)行,并控制游戲中的角色屬性和重要的數(shù)據(jù)參數(shù)。而對(duì)于主循環(huán)體以外的部分,也可能是次要循環(huán)部分,同樣要注意是給其否分配了過(guò)多的資源,而沒(méi)有分配給那些更需要資源的核心部分。 通過(guò)積累在各處節(jié)約出來(lái)的時(shí)間(可能每處僅僅是幾個(gè)毫秒),您會(huì)明顯發(fā)現(xiàn)自己的swf運(yùn)行得更加穩(wěn)定,并且游戲感也大大加強(qiáng)。簡(jiǎn)潔與高效的代碼書(shū)寫(xiě)出十分簡(jiǎn)潔、可以再次調(diào)用的代碼(有時(shí)可能是面向?qū)ο蟮?是一項(xiàng)精細(xì)的工作,但這需要多年的編程經(jīng)驗(yàn)。對(duì)于OOP(object oriented programming,面向?qū)ο蟮某绦蛟O(shè)計(jì)),有些場(chǎng)合根本利用不到它的優(yōu)勢(shì),這使得它顯得十分奢侈。在有限的資源條件下(可能是flash播放器的原因),通過(guò)更先進(jìn)的方法,像剛剛提到的OOP,就可能反而導(dǎo)致令人不滿(mǎn)意的結(jié)果。我們并不是說(shuō)OOP對(duì)游戲編程不好,只是在某些場(chǎng)合它顯得過(guò)于奢侈和多余。畢竟有時(shí)候“傳統(tǒng)的方法”卻能得到更好的結(jié)果。大體而言,用OOP是比較好的,因?yàn)樗尨a維護(hù)更加簡(jiǎn)單。但在后文中,你會(huì)看到有時(shí)為了充分發(fā)揮flashplayer性能,而不采用OOP技術(shù)。例如:處理快速滾動(dòng)或者計(jì)算十分復(fù)雜的數(shù)學(xué)問(wèn)題?;镜膬?yōu)化一提及代碼優(yōu)化,我們馬上會(huì)聯(lián)想到執(zhí)行速度的改進(jìn),而很少去考慮系統(tǒng)資源的分配。這是因?yàn)楫?dāng)今,即使是將被淘汰的計(jì)算機(jī),都有足夠的內(nèi)存來(lái)運(yùn)行我們大部分的flash游戲(128M的內(nèi)存足以滿(mǎn)足大多數(shù)情況的需要,況且,512M的內(nèi)存是當(dāng)今新電腦的基本配置)變量在各種重要的代碼優(yōu)化手段中,有這么一條:在定義局部變量的時(shí)候,一定要用關(guān)鍵字var來(lái)定義,因?yàn)樵贔lash播放器中,局部變量的運(yùn)行速度更快,而且在他們的作用域外是不耗占系統(tǒng)資源的。aw附:var變量?jī)H僅在花括號(hào)對(duì)中才有“生命”,個(gè)人認(rèn)為沒(méi)有系統(tǒng)學(xué)過(guò)編程的人容易出錯(cuò)的一個(gè)地方:awMC.onLoad = function()var aw = 1;awMC.onEnterFrame = function()/不存在aw這個(gè)變量一段非優(yōu)化代碼:function doSomething()mx = 100my = 100ar = new Array()for (y=0; y my; y+)for (x=0; x mx; x+)i = (y * mx) + xarri = i return arr這段代碼中,并未聲明函數(shù)體內(nèi)的那些變量(那些僅僅在函數(shù)內(nèi)使用的變量)為局部變量,這使得這些變量被播放器調(diào)用的速度更慢,并且在函數(shù)執(zhí)行完畢的時(shí)候仍然耗占系統(tǒng)資源。下面列出的是經(jīng)過(guò)改進(jìn)的同樣功能的代碼:function doSomething()var mx = 100var my = 100var ar = new Array()for (var y=0; y my; y+)for (var x=0; x 50)/ 進(jìn)行某些操作它的執(zhí)行速度明顯高于下面這段代碼:for (var i=0; i 50)/ 進(jìn)行某些操作前者的效率比后者提高了30%,這個(gè)數(shù)字在你的游戲要逐幀執(zhí)行這一段代碼的時(shí)候顯得更加寶貴!高級(jí)優(yōu)化:1) for循環(huán) 和 while循環(huán)用while循環(huán)將會(huì)得到比f(wàn)or循環(huán)更好的效率。然而,從數(shù)組中讀取數(shù)據(jù),用for in循環(huán)式最好的選擇!所以我們不推薦使用:for (var i=0; i 1000; i+)/進(jìn)行某些操作而推薦使用var i=-1while (+i 1000)/進(jìn)行某些操作2) 從數(shù)組中讀取數(shù)據(jù)我們通過(guò)測(cè)試發(fā)現(xiàn),for in循環(huán)的效率大大高于其他的循環(huán)方式。參看:arr = MAX = 5000/數(shù)組賦值for (i=0; i MAX; i+)arri = ivar item = null/ 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 = -1while(+i MAX)item = arri3) 向數(shù)組中寫(xiě)入數(shù)據(jù)(while , for)可以看到while循環(huán)稍占優(yōu)勢(shì)。4) _global(全局)變量同Timeline(時(shí)間軸)變量我們猜測(cè)采用全局變量能提高變量調(diào)用速度,然而效果并不像預(yù)計(jì)的那樣明顯。5) 單行、多行變量賦值我們發(fā)現(xiàn)單行變量賦值效率大大高于多行。比如:a = 0b = 0c = 0d = 100e = 100效率就不如:a = b = c = 0d = e = 1006) 變量名尋址這個(gè)測(cè)試反映了變量名的預(yù)尋址是非常重要的,尤其是在循環(huán)的時(shí)候,一定要先給定一個(gè)指向。這樣大大節(jié)約了尋址時(shí)間。比如:var num = nullt = 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.floorvar ceil = Math.ceilfor (var i=0; i MAX; i+)num = floor(MAX) - ceil(MAX)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 = it1.text = Inside: + (getTimer() - t)/ 外部聲明t = getTimer()var test2for (var i=0; i -1)if (a = 1 & b = 2 & c = 3 & d = 4)var k = d * c * b * a/下面的判斷更加節(jié)省時(shí)間var i=MAXwhile(-i -1)if (a = 1)if (b = 2)if (c = 3)if (d = 4)var k = d * c * b * a10) 尋找局部變量(this方法同with方法比較)局部變量的定位方法很多。我們發(fā)現(xiàn)用with比用this更加有優(yōu)勢(shì)!obj = obj.a = 1obj.b = 2obj.c = 3obj.d = 4obj.e = 5obj.f = 6obj.g = 7obj.h = 8obj.test1 = useThisobj.test2 = useWithMAX = 10000function useThis()var i = MAXwhile(-i -1)this.a = 1this.b = 2this.c = 3this.d = 4this.e = 5this.f = 6this.g = 7this.h = 8function useWith()var i = MAXwhile(-i -1)with(this)a = 1b = 2c = 3d = 4e = 5f = 6g = 7h = 811) 循環(huán)監(jiān)聽(tīng)鍵盤(pán)事件同剛才所提到的尋址一樣,我們實(shí)現(xiàn)給一個(gè)指向會(huì)得到更好的效率,比如:keyDown = Key.isDownkeyLeft = 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_r(_root.myMc + i)var mc = _rootmyMc + i/兩者效率差不多16) 涉及MC的循環(huán):ASBroadcaster 同歡同循環(huán)的差別結(jié)論我們從這些測(cè)試結(jié)果中發(fā)現(xiàn),對(duì)于不同的需求,采用不同的代碼,我們可以大大提高腳本執(zhí)行效率。雖然我們?cè)谶@里羅列了許多的優(yōu)化代碼的方法,需要大家自己測(cè)試、實(shí)驗(yàn)的還有很多(考慮到每個(gè)人的需求不同).如果你想更加深入地討論這類(lèi)問(wèn)題。第三章 淺釋ActionScript的代碼優(yōu)化本文既為淺談代碼優(yōu)化,那么就不深入到OOP設(shè)計(jì)層面。僅涉及Flash8幫助里面提到的一些代碼編寫(xiě)優(yōu)化原則,并加以解釋。準(zhǔn)則來(lái)源于Flash8 幫助,我做了一些解釋?zhuān)?.避免從一個(gè)循環(huán)中多次調(diào)用一個(gè)函數(shù) 在循環(huán)中包含小函數(shù)的內(nèi)容,可使效果更佳。小函數(shù)生命期短,利于資源釋放。尤其是在大的循環(huán)中時(shí)。2.盡可能使用本機(jī)函數(shù) 本機(jī)函數(shù)要比用戶(hù)定義的函數(shù)運(yùn)行速度更快。本機(jī)函數(shù)即Flash中內(nèi)有的一些函數(shù)(intrinsic),比如hitTest(),你沒(méi)必要自己寫(xiě)一個(gè)類(lèi)似的。3.不要過(guò)多使用 Object 類(lèi)型。 數(shù)據(jù)類(lèi)型注釋?xiě)?yīng)力求精確,這樣可以提高性能。只有在沒(méi)有適當(dāng)?shù)膫溥x數(shù)據(jù)類(lèi)型時(shí),才使用 Object 類(lèi)型。同時(shí)也便于代碼管理,時(shí)刻知道對(duì)象的類(lèi)型和作用。同時(shí)也有利于編譯器編譯時(shí)優(yōu)化。4.避免使用 eval_r() 函數(shù)或數(shù)據(jù)訪(fǎng)問(wèn)運(yùn)算符。 通常,較為可取且更有效的做法是只設(shè)置一次局部引用。不得已時(shí)才用eval,比如轉(zhuǎn)換_droptarget為MovieClip時(shí)。5.在開(kāi)始循環(huán)前將 Array.length 賦予變量,尤其是大的循環(huán)。 在開(kāi)始循環(huán)前將 Array.length 賦予變量(比如var iLength:Number),將其作為條件使用,而不是使用 myArr.length 本身。原因,在循環(huán)中,iLength是Number變量,會(huì)被放入寄存器使用,效率遠(yuǎn)比訪(fǎng)問(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(fontArri);來(lái)代替:var fontArr:Array = TextField.getFontList();for (var i:Number = 0; i fontArr.length; i+) trace(fontArri);6.注重優(yōu)化循環(huán)及所有重復(fù)動(dòng)作。Flash Player 花費(fèi)許多時(shí)間來(lái)處理循環(huán)(如使用 setInterval() 函數(shù)的循環(huán))。7.在局部變量夠用時(shí),不要使用全局變量。類(lèi)靜態(tài)變量也要少用。全局變量是開(kāi)發(fā)者的惡夢(mèng)。實(shí)在需要全局變量的話(huà),我建議使用singleton設(shè)計(jì)模式來(lái)進(jìn)行管理。8.聲明變量時(shí),添加 var 關(guān)鍵字。這是為了編譯時(shí)讓編譯器知道你的變量類(lèi)型,優(yōu)化編譯。黑羽補(bǔ)充一點(diǎn):對(duì)關(guān)鍵字的使用要謹(jǐn)慎。不贊成使用關(guān)鍵字作為自己的method和屬性名,除非你確認(rèn)后續(xù)開(kāi)發(fā)不會(huì)用到相同的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國(guó)建筑裝飾設(shè)計(jì)項(xiàng)目創(chuàng)業(yè)計(jì)劃書(shū)
- 中國(guó)肌肉刺激器項(xiàng)目創(chuàng)業(yè)計(jì)劃書(shū)
- 中國(guó)BOSS系統(tǒng)項(xiàng)目創(chuàng)業(yè)計(jì)劃書(shū)
- 中國(guó)掛面制造項(xiàng)目創(chuàng)業(yè)計(jì)劃書(shū)
- 2025版簡(jiǎn)易服務(wù)合同范本
- 中國(guó)AFC自動(dòng)售票檢票系統(tǒng)項(xiàng)目創(chuàng)業(yè)計(jì)劃書(shū)
- 高壓力縮比進(jìn)氣道優(yōu)化設(shè)計(jì)方法-洞察闡釋
- 安全教考試試題及答案
- 社區(qū)農(nóng)田建設(shè)合作合同書(shū)
- 知識(shí)產(chǎn)權(quán)保護(hù)意識(shí)-洞察闡釋
- 北京市海淀清華附中2024屆高二數(shù)學(xué)第二學(xué)期期末達(dá)標(biāo)檢測(cè)試題含解析
- 《城市道路與交通》課件
- 高處作業(yè)吊籃危險(xiǎn)源辨識(shí)及風(fēng)險(xiǎn)評(píng)價(jià)表
- 反對(duì)本本主義的背景內(nèi)容及其意義課件
- 火電廠危險(xiǎn)化學(xué)品安全管理課件
- 《中國(guó)近現(xiàn)代史綱要(2023版)》課后習(xí)題答案合集匯編
- 常用應(yīng)用文寫(xiě)作格式
- (國(guó)衛(wèi)版)老年人能力評(píng)估
- 國(guó)開(kāi)2023秋《人文英語(yǔ)3》第1-4單元作文練習(xí)參考答案
- (完整版)雨水收集系統(tǒng)施工方案
- 電磁場(chǎng)與電磁波智慧樹(shù)知到課后章節(jié)答案2023年下同濟(jì)大學(xué)
評(píng)論
0/150
提交評(píng)論