2009-09-21 66 views
9

我目前正在研究一個非常大型的Flash平臺遊戲(數百個課程),並且處理遊戲慢慢磨礪到停止的問題,如果你足夠長的時間。我沒有寫遊戲,所以我只是模糊地熟悉它的內部。一些神祕的症狀包括,隨着時間的推移,AS3的遊戲性能大幅下降

  • 遊戲將運行良好的時間(在給定的水平),當突然它會成倍地開始泄漏內存。
  • 當屏幕上有更多精靈時,遊戲達到指數級泄漏的時間會縮短。
  • 即使沒有任何東西被顯示在屏幕上,遊戲也會變慢。
  • 隨着更頻繁的精靈碰撞,遊戲變慢。
  • 完全禁用衝突代碼的確會減緩降級,但不會阻止遊戲最終丟棄幀。在源

尋找和使用Flex分析器,我的首要嫌疑人,

  • 還有許多遊蕩的對象,尤其是WeakMethodClosure,佔用了大量的內存。
  • 該軟件對弱事件監聽器進行了非常廣泛的使用(每幀調度數十次)。
  • 每次創建新的精靈時都會複製BitmapData。這些是50x50像素精靈,每秒產生大約8個精靈。

我知道幾乎不可能在沒有看到源代碼的情況下告訴我問題,所以我只是在尋找可能幫助我縮小範圍的小花絮。有沒有人在他們自己的項目中體驗到這種迴避性能下降?你的情況是什麼原因?

回答

7

我最近完成了一個大型項目的優化。 ,我可以給你一些建築建議:

  1. 主要原則 - 儘量做到儘可能少的函數/事件調用
  2. 擺脫掉所有,但一個 的onEnterFrame/onInterval /計時器觸發週期。盡你所能 需要一個一般事件調用。 您可能需要很多靜態數組來存儲處理的對象 引用。
  3. 做圖形/還可能導致東西在一個主循環,而不是
  4. 嘗試使用大(可能是分段的)帆布小精靈/位圖。 通常它可用於背景。但也工作好一個更小的物體 (如樹,平臺等)
  5. 破除小位圖資源,它組裝到一個磚片,並直接從中得出你的東西 ,通過源rect屬性

我希望它能幫助你!內存泄漏 - 這種頭痛。

P.S.在不同的瀏覽器中測試你的遊戲,IE瀏覽器 - 大部分都是漏掉的,有時在刷新後不會清除內存。

+0

我認爲這對於剛開始一個大型遊戲項目並想知道如何最好地構建它的人來說是一個很好的建議。 – Kai 2009-09-22 16:13:14

0

聽起來像你需要分析你的應用程序,看看發生了什麼。

該主題提出了一些建議,但最終只需要輸入代碼來幫助確定發生了什麼。

Profiling ActionScript-3 Code

你可能想看看你是否可以運行一段時間一些較小的部分,看看如果你看到一個放緩。

您可能希望單元測試您的應用程序,以便您可以快速運行各個部分,查找內存泄漏。 一個框架是:http://asunit.org/,另一種是:http://opensource.adobe.com/wiki/display/flexunit/

單元測試是我使用的分析很大,這樣你就可以在你的遊戲的頂級測試,運行數千次,尋找問題,然後運行每個部件並查看哪些部件有問題,然後按照自己的方式進行。這是一個手動過程,但如果開始列出的SO線程中的兩個想法不起作用,這可能是您最好的方法。

您使用的內存太多嗎?或者你的CPU使用率太高?

+0

這個問題提到內存泄漏,所以我猜cpu使用率不是問題。 – 2009-09-21 22:00:51

+0

我想知道除了猜測之外是否還有其他問題。不幸的是,當我猜測我的程序出現問題時,我傾向於錯誤,這就是爲什麼我非常依賴分析。 – 2009-09-21 22:16:22

+0

我想知道如果過多的垃圾回收會導致程序退化,原因是生成的對象太多太快。 – 2009-09-21 22:18:07

0

首先確定您的存儲器或處理器限制是否達到。聽起來像後面的,似乎有很多對象在做些什麼......可能這些額外的精靈沒有被很好地釋放。在這些事件中查找對象/變量/任何事物之間的依賴關係,確保刪除精靈,注意EnterFrame的任何處理程序或循環事件。

3
  • 避免匿名方法 - 將它們改爲類級方法。
  • 使用addEventListener中的弱引用和/或確保刪除對象的所有偵聽器,然後使用removeChild刪除對象
  • 確保您removeChild所有的精靈,而不是讓它們飛離屏幕。另外,如果可能的話,重複使用精靈而不是創建新的精靈。
1

如果您有大量的創建/破壞正在進行,您應該考慮對象池,特別是對於像bitmapdata這樣的重物。

看到Object Pool class

+0

一旦我確定哪些資源導致瓶頸,這是一個好主意。 – Kai 2009-09-22 16:16:17

0

這聽起來更有可能的是,你是在比內存處理器速度達到上限。你必須額外努力去限制Flash應用程序的內存。

幸運的是有很多簡單的事情可以做,以保持CPU下來...

1)嚴格管理事件偵聽一切,尤其是鼠標的聽衆。你的所有精靈對象都有$ texas事件監聽器嗎?這可能是一個問題。

2)使用int或uint而不是Number訪問數組。這是巨大的,這是Adobe的詭計之一。使用int和uint訪問數組對象比使用Number更快,如果你進行了大量的迭代(聽起來就像你這樣做),這可能會減少幀執行時間的寶貴毫秒數。

3)與#2一樣,監視您的數學運算以及您在某些操作中使用的類型。在AS3的數學運算中可以做的最慢的事情是重複投射(將ints提供給返回Number的函數),或者執行基本操作,如在Number而不是int上進行加法和減法。

在Flash中使用wtfhuge程序的好處是,即使是較小的優化更改也會對性能產生重大影響。我曾經在AS3玩過一個光線追蹤引擎,在那裏我宣佈了一個額外的變量,它將我的FPS從30殺死到23.

+0

我相信我的遊戲至少在幾個地方打破了這些規則。我希望它就這麼簡單! – Kai 2009-09-22 16:13:58

0
Flash有一個相當臭名昭着的問題(許多人認爲它是一個錯誤),導致定時器的事件偵聽器和ENTER_FRAME事件不會被垃圾收集,即使它們被弱引用。因此,儘管使用弱引用事件是一種很好的做法,但仍然應當在不再需要時刪除所有事件偵聽器。
+0

在快速搜索Event.ENTER_FRAME後,我找到了18場比賽,所以可以肯定的是這個問題也可以在這裏。 – Kai 2009-09-22 16:15:25

相關問題