第一章 AS3的一些優(yōu)化計(jì)算方法
- 用乘法來代替除法(當(dāng)除數(shù)可轉(zhuǎn)化為有限數(shù)的時(shí)候)。比如var n:Number = value * 0.5;要比var n:Number = value / 2;快。但差別并不是很大。只有在需要大量計(jì)算情況下,比如3D引擎中差別才比較明顯。
- 用位運(yùn)算代替除2或乘2。比如10>>1要比10*2快,而10<<1要比10*2快。從測(cè)試來看位運(yùn)算幾乎比乘除快一倍,但是一般情況下,我們不能選擇位運(yùn)算,比如我們就不能用13>>1來代替13/2,盡管前者比后者運(yùn)算速度更快,但2者的運(yùn)算結(jié)果卻不一樣。所以還是要看具體情況。
- 用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)來代替。比如var test:uint =1.5>>0,比unit()或int()更快。
- 用乘-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);快。當(dāng)然還有更多的優(yōu)化計(jì)算的方法。一般來說,低級(jí)運(yùn)算要比高級(jí)運(yùn)算速度;內(nèi)部方法比調(diào)用其他方法速度快。另外要注意的是,這些方法有的時(shí)候可能并一定適用。
第二章 Actionscript 優(yōu)化指南
原著 Marco Lapi,alias Lapo, aw譯
在這篇文章中,我們將討論多種優(yōu)化 Actionscript 代碼的方法.此外我們也針對(duì)一些典型的游戲代碼進(jìn)行了系列測(cè)試,來最大限度的發(fā)掘、提高Flash播放器的性能。何時(shí)進(jìn)行優(yōu)化對(duì)現(xiàn)有程序進(jìn)行優(yōu)化的過程,有時(shí)十分的冗長與困難,這與原始代碼的非優(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)部分,同樣要注意是給其否分配了過多的資源,而沒有分配給那些更需要資源的核心部分。 通過積累在各處節(jié)約出來的時(shí)間(可能每處僅僅是幾個(gè)毫秒),您會(huì)明顯發(fā)現(xiàn)自己的swf運(yùn)行得更加穩(wěn)定,并且游戲感也大大加強(qiáng)。
簡(jiǎn)潔與高效的代碼
書寫出十分簡(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播放器的原因),通過更先進(jìn)的方法,像剛剛提到的OOP,就可能反而導(dǎo)致令人不滿意的結(jié)果。
我們并不是說OOP對(duì)游戲編程不好,只是在某些場(chǎng)合它顯得過于奢侈和多余。畢竟有時(shí)候“傳統(tǒng)的方法”卻能得到更好的結(jié)果。大體而言,用OOP是比較好的,因?yàn)樗尨a維護(hù)更加簡(jiǎn)單。但在后文中,你會(huì)看到有時(shí)為了充分發(fā)揮flashplayer性能,而不采用OOP技術(shù)。例如:處理快速滾動(dòng)或者計(jì)算十分復(fù)雜的數(shù)學(xué)問題;镜膬(yōu)化一提及代碼優(yōu)化,我們馬上會(huì)聯(lián)想到執(zhí)行速度的改進(jìn),而很少去考慮系統(tǒng)資源的分配。這是因?yàn)楫?dāng)今,即使是將被淘汰的計(jì)算機(jī),都有足夠的內(nèi)存來運(yùn)行我們大部分的flash游戲(128M的內(nèi)存足以滿足大多數(shù)情況的需要,況且,512M的內(nèi)存是當(dāng)今新電腦的基本配置)
變量
在各種重要的代碼優(yōu)化手段中,有這么一條:在定義局部變量的時(shí)候,一定要用關(guān)鍵字var來定義,因?yàn)樵贔lash播放器中,局部變量的運(yùn)行速度更快,而且在他們的作用域外是不耗占系統(tǒng)資源的。
aw附:var變量僅僅在花括號(hào)對(duì)中才有“生命”,個(gè)人認(rèn)為沒有系統(tǒng)學(xué)過編程的人容易出錯(cuò)的一個(gè)地方:
awMC.onLoad = function(){ var aw = 1; } awMC.onEnterFrame = function(){ //不存在aw這個(gè)變量 } 一段非優(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 arr[i] = i } } return arr }
這段代碼中,并未聲明函數(shù)體內(nèi)的那些變量(那些僅僅在函數(shù)內(nèi)使用的變量)為局部變量,這使得這些變量被播放器調(diào)用的速度更慢,并且在函數(shù)執(zhí)行完畢的時(shí)候仍然耗占系統(tǒng)資源。
下面列出的是經(jīng)過改進(jìn)的同樣功能的代碼:
function 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 arr[i] = i } } return arr }
這樣一來所有的變量均被定義為了局部變量,他們能夠更快地被播放器調(diào)用。這一點(diǎn)在函數(shù)大量(10,000次)循環(huán)運(yùn)行時(shí)顯得尤為重要!當(dāng)一個(gè)函數(shù)調(diào)用結(jié)束的時(shí)候,相應(yīng)的局部變量都會(huì)被銷毀,并且釋放出他們占有的系統(tǒng)資源。
出處:相關(guān)論壇
責(zé)任編輯:bluehearts
上一頁 下一頁 FLASH程序優(yōu)化 [2]
◎進(jìn)入論壇RIA設(shè)計(jì)與應(yīng)用版塊參加討論
|