2013-07-05 30 views
11

Unity3D Profiler爲我提供了主要關於垃圾回收的尖峯。在下面的屏幕截圖中,三個紅色尖峯代表我在遊戲中的三個攤位。每個檔位都是100 + ms,大部分時間都花在TrackDependencies上。Unity3D:優化垃圾回收

Unity instruction,我嘗試添加這對我的代碼:

if (Time.frameCount % 30 == 0) 
{ 
    System.GC.Collect(); 
} 

這並沒有幫助。我仍然有尖峯,他們仍然需要100 +毫秒。究竟發生了什麼,我該怎麼做才能優化我的遊戲?

PS:

我動態創建和我的比賽毀了很多GameObject秒。這可能是一個問題嗎?

我沒有在循環或數組中作爲返回值的字符串連接,因爲在the post中有所說明。

profiler

+0

你是否正在銷燬代碼中某處的對象? – Heisenbug

+0

如果可能的話,合併物體以避免過度破壞可能是一個很好的解決方案。 – SlxS

+0

@Heisenbug是的,我在動態創建和銷燬遊戲中的很多對象。在我的銷燬對象函數中,我也叫'Resources.UnloadUnusedAssets();' – CherryQu

回答

12

這並沒有幫助。我仍然有尖峯,他們仍然需要100 +毫秒。什麼 到底是怎麼回事,我能做些什麼來優化我的遊戲?

隨着System.GC.Collect你只是強制垃圾收集。如果你已經分配了大量內存從上次收集中解除分配,那麼你無法避免出現尖峯。這只是爲了試圖隨時分發垃圾回收,避免大量的重新分配。

我在我的 遊戲中動態地創建和銷燬了很多GameObjects。這可能是一個問題嗎?

也許這可能是問題所在。

一些提示:

  • 嘗試分配(LoadResourceInstantiate)儘可能的資源在開始你的應用程序。如果所需的內存不是太多,您可以簡單地實例化所需的所有資源,並根據需要禁用/啓用它們。如果資源內存需求巨大,這是不可實現的。
  • 避免與InstantiateDestroy進行內部通話。創建一個對象池,其中一組資源在應用程序啓動時被實例化。啓用您需要的資源,並禁用所有其他資源。而不是銷燬一個對象將其釋放到池中,以便可以根據需要禁用和重新使用它。
  • 避免與Resources.UnloadUnusedAssets通話。這隻會增加實例化新資源所需的時間,如果您以前釋放它的話。對opitmize內存使用情況是有用的,但以costant間隔或每次銷燬對象時調用它都沒有意義。