2015-01-06 76 views
4

我有一個使用Sprite-Kit和Swift的遊戲,其中我從屏幕頂部到屏幕底部生成隨機圓圈。FPS下降和遊戲變慢 - Sprite-Kit和Swift

啓動遊戲時,它在開始時運行得非常好(大約60 FPS或更低),但隨後FPS逐漸下降,遊戲變得非常緩慢......我不明白爲什麼FPS會隨着時間而下降(節點數保持在8-10左右,所以當它們離開屏幕時它們會被移除) - 我在iOS模擬器和實際設備上測試了它,有什麼想法?

我檢查過,問題不是來自內存泄漏。另外,我只使用一個視圖控制器。

,我認爲可能會導致這個問題是這樣的,但我不知道爲什麼,唯一的功能:

/* Function to generate single random circle */ 
func generateCircle() -> Void { 
    let circleSize:CGFloat = CGFloat(arc4random_uniform(40) + 3) 
    let xPosition:CGFloat = CGFloat(arc4random_uniform(UInt32(size.width))) 

    var randomCircle = SKShapeNode(circleOfRadius: circleSize) 
    randomCircle.strokeColor = SKColor.redColor() 
    randomCircle.fillColor = SKColor.redColor() 
    randomCircle.physicsBody = SKPhysicsBody(circleOfRadius: circleSize) 
    randomCircle.physicsBody?.dynamic = false 
    randomCircle.position = CGPoint(x: xPosition, y: size.height + circleSize*2) 
    randomCircle.physicsBody?.dynamic = true 
    randomCircle.physicsBody?.categoryBitMask = randomCirclesGroup 
    addChild(randomCircle) 
} 
+0

你可能在遊戲中使用了多個UIVIewControllers?從以往的經驗來看,這會導致糟糕的表現 – Bokoskokos

+0

節點數只考慮正在繪製的節點。離屏節點不計算在內,但可能仍然在層次結構中。但是因爲他們沒有畫出來。無論如何,這可能有很多原因,並且需要一些你至少懷疑或者更好的代碼:已經測得性能很差。一個非常常見的初學者的錯誤是創建太多的節點或實體,可能每次都應該改變某些東西,而不是僅僅改變它們的屬性。但是這是一炮打響。開始刪除代碼,直到您發現性能明顯更好,然後在此處發佈該代碼(其具有性能影響)。 – LearnCocos2D

+0

@ LearnCocos2D謝謝,我發佈了一些代碼,我認爲這可能是問題(當我生成下降的圓時,它可能會減慢) – sachalondon

回答

2

也許有內存泄漏。

  1. 用Xcode啓動你的遊戲。
  2. 打開Xcode調試導航器面板與CMD + 6
  3. 選擇內存並等待查看分配的內存是否增長。

如果發生這種情況,我的意思是如果分配的內存繼續增長,即使你知道它不應該,那麼你正在泄漏內存。

而在代碼中找到問題的確切位置的最佳工具是儀器

1

我以前有過這個,節點數使它看起來已經消失了,但它們確實不是。

你需要從視圖中刪除圈子以真正擺脫它們。

首先,您需要定義一套(你的類中,而不是任何函數內)

let circles = Set<SKShapeNode>() 

然後在generateCircle()功能,你會說:

circles.insert(randomCircle) 
update()功能

然後:

override func update(currentTime: CFTimeInterval){ 
     for index in circles { 
      if index.position.y <= 0 { 
       index.removeFromParent() 
       circles.remove(index) 
      } 
     } 
} 

基本上這是做什麼,在每一幀,檢查是否有任何圓圈低於屏幕底部,如果它們是刪除它們。

0

SKShapeNodeSKSpriteNode相比性能較差,如果可能的話,應儘量避免使用SKShapeNode

From Apple's documentation

形狀節點是內容不能被容易地分解成 簡單紋理精靈是有用的。形狀節點對於 內容構建和顯示遊戲頂部的調試信息也非常有用。但是,SKSpriteNode類比此類提供更高的性能 ,因此請謹慎使用形狀節點。

如果你真的想用SKShapeNode小號(也許是因爲它很容易爲原型)我勸你做到以下幾點:

  • 爲你的形狀創建紋理單一時間,也許當場景被加載。
  • 緩存渲染的紋理。在你的情況下,具有大小和紋理的字典似乎是合適的,例如[CGSize: SKTexture]
  • 從此,無論何時您需要一個形狀,從緩存中檢索紋理並使用SKSpriteNode來顯示它們。

要渲染的SKShapeNode到紋理you can use SKView's textureFromNode function

渲染的節點樹的內容,並返回所呈現的圖像作爲一個 質地SpriteKit。