2017-02-23 21 views
0

對不起,在這裏發表,但我絕望。統一 - 場景改變後記憶力不會下降

我們似乎有一堆內存在加載新場景時沒有被釋放。當前加載過程從1級開始,使用單例加載屏幕加載到空場景,然後調用System.GC.Collect();和Resources.UnloadUnusedAssets(); (以防萬一)然後加載下一個級別。但是級別只會增加內存大小,即使重新加載現有場景,內存也只會增加。

這裏是發生了什麼的簡要概述:開始在各地590,000K(根據任務管理器的內存使用情況)

  • 裝入樞紐地帶。這似乎確定,因爲它的周圍區域
  • 三維散步過渡到一個空的場景(通過上圖)後,仍然有在405,000K
  • 程序加載後啓動第一個實際水平內存在840,000K
  • 後放回空的場景再次存儲在750,000K
  • 開始一個新的電平(第2級)後它跳到1,195,000K
  • 加載放回空的場景之後與上述存儲器是在1,010,000K
  • 然後回到HUB世界(通過上面的加載轉換)內存在1, 227,000K

我不認爲這是統一資產泄漏,因爲我已經通過清理過程網格/材料並在空的加載屏幕中查找了UnityObject存在和它只有這(上述過程後):

Loading Scene Results

此時的存儲器快照看起來像這樣:

Memory Snapshot

我不知道他們是否是這個問題,或者它是否是一個編輯器,但是無論如何追蹤什麼是創建渲染紋理?

我們發現的一件事是加載到老闆級別,然後回到HUB區域,實際上會減少內存(從Boss - > HUB區域出來後大約需要800MB)。但我不確定爲什麼會觸發內存被清除。

目前關於統一5.5.0f3

如果任何人有這爲什麼發生任何想法或能幫助這將是非常讚賞。

謝謝

+0

任務管理器內存顯示可能有點誤導。與任何使用託管內存運行時的應用程序一樣,Unity可能在內部「釋放」了內存,但尚未將其釋放回操作系統。通過使用知道這一點的內存分析器,您可以獲得更一致的結果,例如[內置於Unity的分析器](https://docs.unity3d.com/Manual/ProfilerMemory.html)。 – rutter

回答

0

您應該使用Unity自帶的分析器來剖析應用程序。 基於此,你應該能夠弄清楚擁抱內存。

如果您使用地圖集,則需要確保您使用它們的全部容量:只使用sprite或2(例如用於UI)將加載整個地圖集。在像這樣的情況下更好的是將地圖集分成較小的地圖集。

您可能還需要弄清楚代碼的某些部分是否保留對資產的引用。如果他們這樣做,並且劇本在改變場景的情況下生存下來,那麼你會得到「泄漏」的記憶。

另一點需要注意的是,只要您改變場景,Unity就不會釋放內存。

+0

上面的內存快照圖片/鏈接表明它主要是:Objects,ManagedHeap.ReservedUnusedSize,ManagedHeap.Used Size 。但這些都很普遍,有什麼辦法可以從團結中獲得更多細節? 何時不統一通常的空閒內存?有沒有辦法強制它? – ShockDismantler