2011-11-08 127 views
1

我幾乎完成了使用Adobe CS5.5 AIR 3.0 for iOS製作的遊戲。我試圖優化代碼,因爲一些性能問題。優化技巧? AS3 iOS AIR 3.0

林有點新來編程,只是會問一些問題。

  1. 我正在使用一個名爲「GlobalVariables」的類。我用這個就像有一個「速度」,我可以到達任何地方。所以如果我在主線上,或者在課堂上,我可以輸入「GlobalVarialbes.Speed」然後改變速度。這是處理東西的好方法嗎?或者這樣做會對性能造成很大影響嗎?我只是有很多這些「全球變數」。

  2. 一個真正令人討厭的事情是,當物體移動時,我真的需要FPS爲60 FPS。因爲如果FPS在30-40左右,物體不會以相同的速度移動,並且物體似乎彼此更接近......這真的很煩人。我只是使用object.x + = GlobalVariables.Speed(速度也許是4)......這裏有什麼建議?

  3. 如果我使用背景,它實際上需要從我的FPS很多。大約7-10幀/秒。我怎樣才能使背景圖片較少的性能飲食?

  4. 一般提示也許?我用在iOS devies的GPU模式:)

EDIT請回答這個問題:我的朋友告訴我用「很多」如果是因爲,然後,它會爲preforance更容易的實際看,如果它甚至要不要讀下面的代碼。 :)

回答

6

通過你會列出一個在同一時間。 (其真4個問題至少)

  1. 進出口使用I類名爲 「GlobalVariables」。我用這個像「速度」那樣的 ,我可以到達任何地方。所以如果我在主線 或在一個類,我可以鍵入「GlobalVarialbes.Speed」,然後改變 的速度。這是處理東西的好方法嗎?或者它是否會因此而變得沉重 ?我只是在其中的許多 「globalvariables」中。 使用全局變量和函數調用可能需要一些時間。如果您在方法中多次使用該變量,則可以通過將該值緩存到局部變量來稍微優化。但是一定要測試結果,如果緩存對象不是原始值,可能會導致調用「new Something()」構造函數,這非常緩慢。

    One REALLY annoying thing is that when objects move, I really need 
    the FPS to be 60 FPS. Because if the FPS is around 30-40, the 
    objects doesnt move at the same speed, and the objects seems to be 
    alot closer the each other to... This is really annoying. I just use 
    object.x += GlobalVariables.Speed (Speed is maybe 4)... Any 
    suggestions here? 
    

改變你對速度,每幀的像素,每秒像素的方式。然後每秒使用getTimer()來查明自從最後一次渲染幀以來秒數的百分比。我把一些示例代碼在這個線程在這裏:Frame skipping on Flash

If I use a background it actually takes alot of the FPS from me. 
Around 7-10 fps. How can I make a background picture less 
preformance eating? 

背景,並在總圖將是昂貴的操作。如果背景不滾動,請使用cacheAsBitmap。如果可能,請確保背景不包含子圖層。使用位圖而不是矢量。保持儘可能小 - 不要在屏幕外多餘位。另外 - 確保背景沒有被縮放。關閉位圖平滑。嘗試設置舞臺質量StageQuality.LOW或StageQuality.Medium,看看是否有幫助。 == UPDATE == 既然AIR 3.2已經出來,它支持iOS和Android上的OpenGL,請使用該功能。它在flash中被稱爲「stage3D」,它真的是唯一一個用flash來做移動圖形的好方法。用於椋鳥框架的2D圖形。 http://gamua.com/starling/這是憤怒的小鳥在Facebook上使用的引擎。所以它的實際測試和生產準備就緒。 (和它的開源!)

General tips maybe? I use the GPU mode on the iOS devies :) 

一般提示:使用位圖的一切。儘可能避免透明度。不要使用過濾器或混合模式。避免阿爾法補間。避免創建新對象 - 回收常用對象,特別是顯示對象。請記住,添加和移除兒童的成本也很高。如果您在可重複使用的項目符號池中有一堆項目符號,則可以將它們設置爲visible = false。然後在重新初始化該子彈對象時visible = true。嘗試搜索「AS3 Object Pooling」

使用Vector而不是Array。

最後:測試和重新測試。測量每個函數調用的時間。優化Flash是一個深入而豐富的主題 - 它永遠不會耗盡。部分原因是你的里程會因項目而異。這裏是一個很好的鏈接,讓你開始學習AS3的優化技巧http://drawlogic.com/2009/05/22/as3-flash-efficient-code-techniques-vectors-in-flash-10-faster-jpeg-encoding-other-optimization-notes/

+0

哇,謝謝你的一些偉大的信息! – user1036231

+0

「改變你對速度的看法,從每幀像素到每秒像素。」我有沒有明白這個權利btw?我應該使用計時器,並告訴它應該移動多少,而不是使用它應該移動的每幀多少個像素? – user1036231

+0

看看我鏈接到的代碼示例(跳幀鏈接)。您可以使用EnterFrame事件來了解自上一幀以來經過了多少時間。然後一旦你知道已經過了多少時間,你就可以將事物移動到合適的數量。 –

0

1對象作爲參考傳遞,因此對一個類中該對象的更改將反映該對象傳遞到的任何位置。如果您想要全局訪問類,您還可以查看Singleton模式。最後一個建議是使用一個config.as,使用CONST聲明只是在你想要數據的時候實例化一個新的實例。

2這是使用enterFrame事件的一個缺點。改變這個計時器並擺脫enterframe。此外,如果您有繁重的數據操作,您可能希望查看UIComponent並查看無效方法,可以多次更改顯示對象的幀速率。這將允許在重繪(幀速率)將只顯示更新

3您是否嘗試過的cacheAsBitmap

4我不知道實際上有多少GPU的使用,因爲它仍然是相當新的。

0

你已經收到了一些很好的答案,可以幫助你調整大腦的工作方式,幫助你提高成績。我將簡單地添加一個鏈接到一個網站,可以幫助使這些提示具體。 * -bit火箭,如果你還沒有在那裏有最好的blitting和一般的遊戲教程之一,將教你在任何系統上編寫高效的遊戲代碼。

當我現在在編程的時候,我偶然發現了網站,特別是小行星教程將幫助回答這些問題。

http://www.8bitrocket.com/2008/1/20/Tutorial-Using-Flash-CS3-and-Actionscript-3-to-create-Atari-7800-Asteroids-Part-1/

它還會爲你準備的空氣的下一個版本,將有建於Stage3D的API。你會得到一個巨大的性能提升。那時候,我可能會推薦切換到starling框架,該框架使用了您將在教程鏈接到的所有技術,但是在幕後。

http://www.gotoandlearn.com/

有一個體面的介紹教程談論。