2016-09-13 30 views
0

我在Swift和SpriteKit中製作了我的第一款遊戲,並且遇到了無數的CPU問題,在幾分鐘的遊戲過程中我接近100%的CPU。這似乎不應該發生,因爲我一次只畫20個動畫的敵人。雖然這不是唯一的問題,但我相信實例化我的敵人階級正在爲這種過度使用做出重大貢獻。如何使用動畫回收SKSpriteNodes

在我的代碼中,我每隔幾秒就實例化一個新的敵人外星人。我很確定我正在將它們正確地移除 - 無論是在聯繫人還是在離開屏幕時。所以我相信我的下一個嘗試應該是嘗試並回收它們,而不是不斷徹底刪除和添加它們。

我與添加:

func addNormAlien(){ 
    let mult = normAlienMultiplers 

    let alienInst = normAlien(startPos:CGPoint(x: 10,y: 10), speed: random(UInt32(10), max: UInt32(50))*mult[0]) 

    let yStart = random(UInt32(alienInst.size.height/2), max: UInt32(size.height-alienInst.size.height)) 
    alienInst.position = CGPoint(x:size.width+alienInst.size.width/2, y:yStart) 

    addChild(alienInst) 
    totalNodes+=1 
} 

,並與一般的語句刪除:在這兩個接觸方法和更新alien.removeFromParent()如果它的x位置是過去的某個點。

我在想,我可以創建某種數組(或隊列?)某種適合某些最大數量的數組,並且我可以將它們推開或關閉。有沒有適當的方式來回收這樣的SKSpriteNode子類?附:什麼是適當的CPU使用範圍 - 在iPhone上測試時?

+0

我不確定你現在是否想要這樣做。因爲這是你的第一場比賽,並且作爲之前回答過你的一些問題的人,你想要遵循K.I.S.S模型。考慮到你只有20個「敵人」,那麼這就表明你要麼超過20個,要麼你的代碼做得不好。即使你去了一個對象隊列,你可能會獲得一些性能提升,但是你的代碼不會被修復,你會遇到其他問題。之前我曾就如何解決CPU的問題提出了一些建議,我懷疑你是否做過這些。 –

回答

1

我想說你應該看看at the prototype pattern。你基本上只是第一次創造每個敵人並克隆它們以供在遊戲中使用。至少這應該減少文件系統交互(加載紋理等)。

+0

我不認爲我明白 - 這不是像克隆過程一樣密集,而是保存狀態?對於像這樣的相對簡單的2D遊戲,你會說適當的CPU使用在設備上嗎? – Sam

+0

我假設你每次創建敵人時都會從文件系統重新加載紋理。文件系統交互通常很慢。通過創建一個原型,只需要加載一次,並在每次需要使用它們時克隆敵人,就可以將其減少到僅僅是更快速的內存交互。或者,您可以將所有紋理預加載到靜態類中,這可能是一種更簡單的方法。 –

+0

您還應該檢查節點計數(SKScene上的屬性)以確保正確刪除節點。 –