最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

優(yōu)化Flash Actionscript代碼的三種方法

互聯(lián)網(wǎng)   發(fā)布時間:2008-10-06 01:25:23   作者:佚名   我要評論
第一章 AS3的一些優(yōu)化計算方法 來源:John Grden Blog 1.用乘法來代替除法(當(dāng)除數(shù)可轉(zhuǎn)化為有限數(shù)的時候)。比如var n:Number = value * 0.5;要比var n:Number = value / 2;快。但差別并不是很大。只有在需要大量計算情況下,比如3D引擎中差別才比較明顯。 2.用位運算

第二章 Actionscript 優(yōu)化指南
來源 gotoAndStop.it

原著 Marco Lapi,alias Lapo, aw譯
在這篇文章中,我們將討論多種優(yōu)化 Actionscript 代碼的方法.
此外我們也針對一些典型的游戲代碼進(jìn)行了系列測試,來最大限度的發(fā)掘、提高Flash播放器的性能。


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

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

基本的優(yōu)化
一提及代碼優(yōu)化,我們馬上會聯(lián)想到執(zhí)行速度的改進(jìn),而很少去考慮系統(tǒng)資源的分配。這是因為當(dāng)今,即使是將被淘汰的計算機(jī),都有足夠的內(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 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
arr[i] = i
}
}
return arr
}
這段代碼中,并未聲明函數(shù)體內(nèi)的那些變量(那些僅僅在函數(shù)內(nèi)使用的變量)為局部變量,這使得這些變量被播放器調(diào)用的速度更慢,并且在函數(shù)執(zhí)行完畢的時候仍然耗占系統(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)用。這一點在函數(shù)大量(10,000次)循環(huán)運行時顯得尤為重要!當(dāng)一個函數(shù)調(diào)用結(jié)束的時候,相應(yīng)的局部變量都會被銷毀,并且釋放出他們占有的系統(tǒng)資源。
onEnterFrame 事件
onEnterFrame事件對于游戲開發(fā)者而言是非常有用的,它使得我們能夠快速、反復(fù)地按照預(yù)設(shè)幀頻(fps)運行一段程序?;叵朐贔lash5的時代,這(onEnterFrame實時監(jiān)控)是一種非常流行的技術(shù),用這樣的事件來控制機(jī)器游戲?qū)κ值倪壿?,又或者我們可以在每一個子彈上設(shè)置這樣的事件來監(jiān)測子彈的碰撞。
實際上,我們并不推薦給過多的MoveClip添加這樣的事件,因為這樣做會導(dǎo)致“無頭緒碼(spaghetti code)”的出現(xiàn),并且容易導(dǎo)致程序效率明顯降低。
大多數(shù)情況下,用單獨一個onEnterFrame事件就可以解決問題了:用這一個主循環(huán)來執(zhí)行你所需要的操作。
另一個簡單的辦法是設(shè)置一個合適的幀頻:要知道幀頻越高,CPU資源就越緊張。
在幀頻為25-35(fps)之間時,onEnterFrame足以很好地執(zhí)行較復(fù)雜代碼,哪怕你的計算機(jī)配置較低。因此,在沒有特殊要求的場合,我們不推薦使用高于60(fps)的幀頻。
矢量圖與位圖
在處理圖形前,我們一定要做出正確的選擇。Flash能對矢量圖和位圖進(jìn)行完美的兼容,然而矢量圖和位圖在播放器中的表現(xiàn)實質(zhì)卻完全不同。
在用到矢量圖的時候,我們要盡可能簡化它們的形狀,去除多余的端點。這樣做將大大降低播放器用于呈現(xiàn)矢量圖所要進(jìn)行的計算量。另一個重要方面在于線條的運用,盡量減少和避免冗陳的線條結(jié)構(gòu),因為它們會直接影響到flash的播放效率。
當(dāng)某個實例透明度小于100時,也會對播放速率造成影響,所以如果你發(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簡稱為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)用程序和游戲中都被廣泛的使用。
一個典型的例子就是基于區(qū)塊的Flash游戲,在這樣一類的游戲中,地圖有時被存放成形如arr[y][x]的二維數(shù)組。雖然這是一種很常見的方法,但是如果用一維數(shù)組的話,卻能提高程序的運行效率。另一個重要的方法來提高數(shù)組效率是在數(shù)組遍歷的時候使用for in 循環(huán)來代替?zhèn)鹘y(tǒng)的 for 或者while循環(huán)語法。
例如:
一段代碼如下
for (var i in arr)
{
if (arr[i] > 50)
{
// 進(jìn)行某些操作
}
}
它的執(zhí)行速度明顯高于這一段代碼:
for (var i=0; i < 10000; i )
{
if (arr[i] > 50)
{
// 進(jìn)行某些操作
}
}
前者的效率比后者提高了30%,這個數(shù)字在你的游戲要逐幀執(zhí)行這一段代碼的時候顯得更加寶貴!

高級優(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 )
{
//進(jìn)行某些操作
}而推薦使用
var i=-1
while ( i < 1000)
{
//進(jìn)行某些操作
}

2) 從數(shù)組中讀取數(shù)據(jù)
我們通過測試發(fā)現(xiàn),for in循環(huán)的效率大大高于其他的循環(huán)方式。參看:
arr = []
MAX = 5000
//數(shù)組賦值
for (i=0; i < MAX; i )
{
arr[i] = i
}
var item = null
// For 循環(huán)
for (var i=0; i < MAX; i )
{
item = arr[i]
}
// For 循環(huán)
for (var i in arr)
{
item = arr[i]
}

// While 循環(huán)
i = -1
while( i < MAX)
{
item = arr[i]
}

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 = 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 = Math.ceil
for (var i=0; i < MAX; i )
{
num = floor(MAX) - ceil(MAX)
}

7) 短變量名和長變量名
變量名越短,效率越高??紤]到長變量名也有它的好處(比如,便于維護(hù)等),因此建議在關(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:" (getTimer() - t)
// 外部聲明
t = getTimer()
var test2
for (var i=0; i < MAX; i )
{
test2 = i
}

9) 使用嵌套的if結(jié)構(gòu)
當(dāng)用到復(fù)雜的條件表達(dá)式時。把他們打散成為嵌套的獨立判斷結(jié)構(gòu)是最佳方案。下面的代碼我們進(jìn)行了測試,發(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é)省時間
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
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)聽鍵盤事件
同剛才所提到的尋址一樣,我們實現(xiàn)給一個指向會得到更好的效率,比如:
keyDown = Key.isDown
keyLeft = Key.LEFT
//我們再用 if (keyDown(keyLeft))
附:我們測試了按鍵代碼和鍵值常量的效率發(fā)現(xiàn)并無太大差別。

12) Math.floor()方法與int()
這個問題曾在Flashkit的論壇被提出討論過。測試表明,舊的int方法反而效率更高。我們的測試結(jié)果也反映了這一點。

13)eval表達(dá)式與中括號語法
我們并沒有發(fā)現(xiàn)明顯的差別,并不像剛才所述那樣,舊的eval表達(dá)式比起中括號方法并沒有太大的優(yōu)勢
var mc = eval("_root.myMc" i)
var mc = _root["myMc" i]
//兩者效率差不多16) 涉及MC的循環(huán):ASBroadcaster 同歡同循環(huán)的差別

結(jié)論
我們從這些測試結(jié)果中發(fā)現(xiàn),對于不同的需求,采用不同的代碼,我們可以大大提高腳本的執(zhí)行效率。雖然我們在這里羅列了許多的優(yōu)化代碼的方法,需要大家自己測試、實驗的還有很多(考慮到每個人的需求不同).如果你想更加深入地討論這類問題??梢詠砦覀兊恼搲?。
aw附:
終于翻譯完了,自己也學(xué)到很多好東西,大家又什么問題可以去gotoAndPlay的官方,也可以來我的Blog提出!

相關(guān)文章

  • flash cs6鼠標(biāo)跟隨效果實現(xiàn)代碼分享

    flash cs6想要實現(xiàn)鼠標(biāo)跟隨效果?該怎么制作呢?今天我們就來看看使用as2.0實現(xiàn)鼠標(biāo)跟隨效果的教程,需要的朋友可以參考下
    2019-05-19
  • Flash cs6怎么使用代碼輸入中英文文本?

    Flash cs6怎么使用代碼輸入中英文文本?Flash cs6中可以使用文字工具直接輸入文本,也可以使用代碼來輸入文本,該怎么使用代碼輸入文本呢?請看下文詳細(xì)的教程,需要的朋友
    2018-03-11
  • flash as3.0怎么定義抽象類和抽象?

    flash as3.0抽象類怎么定義? as3.0中有很多抽象類,該怎么定義抽象類和抽象方法呢?下面我們就來看看簡單的例子,需要的朋友可以參考下http://m.fzitv.net/softs/408402.
    2018-02-28
  • flash cs6中怎么使用ActionScript3.0?

    flash cs6中怎么使用ActionScript3.0?flash cs6中想要使用ActionScript3.0功能,該怎么使用呢?下面我們就來看看詳細(xì)的教程,需要的朋友可以參考下
    2018-01-25
  • Flash中怎么實現(xiàn)鼠標(biāo)點擊決定圖像位置?

    本教程給大家分享一個Flash小教程,教大家在Flash CS6中怎么實現(xiàn)鼠標(biāo)點擊決定圖像位置?方法很簡單,感興趣的朋友歡迎前來一起分享學(xué)習(xí)
    2018-01-12
  • Flash中如何用代碼將圖片放在自己想要的舞臺位置?

    本教程教腳本之家的ActionScript教程學(xué)習(xí)者在Flash中如何用代碼將圖片放在自己想要的舞臺位置,教程講解的詳細(xì),感興趣的朋友歡迎前來分享學(xué)習(xí)
    2017-11-20
  • 在Flash CS6中使用with函數(shù)繪制背景圖教程

    本教程教腳本之家的ActionScript教程學(xué)習(xí)者如何在Flash CS6中使用with函數(shù)繪制背景圖?教程一步步講解的挺詳細(xì),方法也不難,非常適合Flash新手入門學(xué)習(xí)
    2017-11-18
  • Flash怎么設(shè)置元件坐標(biāo)?flash使用代碼設(shè)置元件的坐標(biāo)的教程

    Flash怎么設(shè)置元件坐標(biāo)?flash中導(dǎo)如的元件需要添加坐標(biāo),該怎么定位元件坐標(biāo)呢?下面我們就來看看flash使用代碼設(shè)置元件的坐標(biāo)的教程,需要的朋友可以參考下
    2017-10-11
  • Flash怎么制作來回?fù)u擺的花朵的動畫?

    Flash怎么制作來回?fù)u擺的花朵的動畫?Flash中想要給花朵制作一段搖擺的動畫效果,該怎么制作呢?下面我們就來看看詳細(xì)的教程,很簡單,需要的朋友可以參考下
    2017-05-23
  • Flash怎么制作流動七彩色的文字?

    Flash怎么制作流動七彩色的文字?想要讓文字動起來,該怎么使用flash給文字制作一個流動七彩色的動畫呢?下面我們就來看看詳細(xì)的教程,需要的朋友可以參考下
    2017-04-23

最新評論

浮梁县| 祁连县| 昌邑市| 象山县| 安徽省| 兰考县| 宁武县| 鹿泉市| 南京市| 瑞昌市| 辽源市| 宜城市| 日喀则市| 渭源县| 鹿泉市| 龙里县| 汝阳县| 江源县| 凤庆县| 叙永县| 辽中县| 遵义市| 虎林市| 香格里拉县| 甘南县| 宣汉县| 鄂伦春自治旗| 论坛| 大新县| 三门峡市| 绥芬河市| 基隆市| 长宁区| 保靖县| 加查县| 宁城县| 余江县| 湘乡市| 贞丰县| 两当县| 台湾省|