2015-04-02 42 views
4

除去動畫紋理我初始化在我的視圖控制器約30動畫紋理上游戲負載這樣的:雪碧試劑盒,從存儲器

for i=0; i<atlasName.count; i++ { 
     frameNumber = animationTextures.animationTextureAtlas[i].textureNames.count 
     firstFrameName = "\(atlasName[i])1" 

     animationTextures.animationFrames.append([animationTextures.animationTextureAtlas[i].textureNamed(firstFrameName)]) 

     for j=2; j<=frameNumber; j++ { 
      var frameName = "\(atlasName[i])\(j)" 
      animationTextures.animationFrames[i].append(animationTextures.animationTextureAtlas[i].textureNamed(frameName)) 
     } 

     animationTextures.firstFrame.append(animationTextures.animationFrames[i][0]) 
    } 

基本上我把所有的動畫到一個數組所以可以很容易地訪問它們。

在遊戲過程中,每個動畫都會出現一小段時間,當我不需要它們時,我使用.removeFromParent()將其刪除,但問題在於它仍然保留在因此一旦遊戲中出現約15-20個動畫並進入內存,它將達到約450-500MB,並在iPhone 4和iPhone 4上崩潰。

有誰知道我怎麼能真的從內存中刪除該動畫,以便它不佔用空間,一旦不再需要它了?

+0

我可以告訴你一個事實,即SpriteKit有一個內置的自動內存管理系統,適用於像這樣的情況。如果紋理數據佔用太多空間,它將自動釋放。我不認爲它的紋理本身是必需的(除非你有ALOT),而崩潰可能與你對這些紋理做什麼有關。 – MaxKargin 2015-04-02 22:35:55

+1

這裏有一些有用的職位關於此:http://stackoverflow.com/a/21541819/3402095,http://stackoverflow.com/questions/5887248/ios-app-maximum-memory-budget – Whirlwind 2015-04-03 00:05:16

+0

它幾乎聽起來像它是事物的組合。首先,也許你並沒有重複使用紋理,即使你將它們放入數組中。其次,即使您調用removeFromParent(),您仍然可以參考精靈。你也可能想看看你創建的數組。當你有名爲frameNumber的變量時,當它們實際上是計數等時很難遵循。您的陣列可能比預期的大得多。希望有幫助。 – 2015-04-03 04:19:09

回答

4

SpriteKit利用自己的緩存機制,你無法自己清除緩存。

從你說的話來看,你的代碼中有一處存在內存泄漏。請記住,您需要刪除紋理的所有引用才能被ARC取消分配。

由於紋理存儲在數組中,所以從父項移除紋理不夠。您需要從陣列中刪除所有紋理,並且沒有其他引用來正確釋放它們。

450MB +對於一些紋理來說絕對是太多了。我建議你運行儀器並檢查內存泄漏。

+0

謝謝你的回答,我知道你說的關於ARC的東西,並刪除所有的參考文獻。在搜索內存泄漏和分配後,我發現問題實際上是菜單屏幕上循環運行的2個動畫。每次循環開始時,它會分配一堆內存,並在達到大約180MB時停止。 – 2015-04-03 09:23:41