即使removeAllChildren调用,SpriteKit中的内存也会增加

时间:2015-12-02 20:46:44

标签: ios xcode swift memory sprite-kit

我一直在努力修复SpriteKit的大量内存增加数周,但没有找到解决方案。我已经尝试了几乎所有我在网上遇到的用于管理SK内存的方法,但我仍然遇到麻烦。这是我的情况:

我首先展示了SKScene" HomeScreen"从那里我在View Controller中使用UIButton更改Page场景,如下所示:

 func nextPage(sender: UIButton) {

    pageNumber = pageNumber + 1

    let switchPage = SKTransition.crossFadeWithDuration(3.0)
    switchPage.pausesOutgoingScene = false

    switch pageNumber {
    case 1: self.skView.presentScene(Page01(size: (self.view?.bounds.size)!), transition: switchPage)
    case 2: self.skView.presentScene(Page02(size: (self.view?.bounds.size)!), transition: switchPage)
    case 3: self.skView.presentScene(Page03(size: (self.view?.bounds.size)!), transition: switchPage)
    case 4: self.skView.presentScene(Page04(size: (self.view?.bounds.size)!), transition: switchPage)
    case 5: self.skView.presentScene(Page05(size: (self.view?.bounds.size)!), transition: switchPage)
    case 6: self.skView.presentScene(Page06(size: (self.view?.bounds.size)!), transition: switchPage)
    case 7: self.skView.presentScene(Page07(size: (self.view?.bounds.size)!), transition: switchPage)
    case 8: self.skView.presentScene(Page08(size: (self.view?.bounds.size)!), transition: switchPage)
    case 9: self.skView.presentScene(Page09(size: (self.view?.bounds.size)!), transition: switchPage)
    case 10: self.skView.presentScene(Page10(size: (self.view?.bounds.size)!), transition: switchPage)
    case 11: self.skView.presentScene(Page11(size: (self.view?.bounds.size)!), transition: switchPage)
    default:
        break
    }
}

这是Xcode的记忆图:

enter image description here

正如您所看到的,我的HomeScreen(HS)内存从38.1开始,当我循环浏览所有场景并返回主屏幕时,它以112结尾。我还单独加载每个页面并记录下来记忆确认增加。

在每个SKScene中,我加载各种对象,然后在willMoveFromView中我将其删除:

    override func willMoveFromView(view: SKView) {

    //Remove the Scroller Components
    self.view?.removeGestureRecognizer(self.page01Drops.panGestureRecognizer)
    self.page01Drops = nil

    //Remove Environment
    self.randomObjectFromScene.texture = nil

    self.anotherRandomObject.removeFromParent

    self.removeAllActions()
    self.removeAllChildren()
}

这里有更多信息: - 场景改变后没有调用Deinit。

  • 使用Instruments测试应用程序时没有泄漏。

  • 所有SKTextures首先使用stringByAppendingPathComponent作为UIImages加载。

  • 所有willMoveFromView方法都包含removeAllActions和removeAllChildren。

有谁知道为什么我的记忆力在增加?

更新更多示例代码

以下是我在viewDidLoad中加载skView的方法:

    skView = view as! SKView
    skView.showsFPS = true
    skView.showsNodeCount = true
    skView.ignoresSiblingOrder = false
    skView.presentScene(homeScreen(size: skView.bounds.size))

这里有点来自我的PageS SKScene:

class Page01: SKScene {
    //Preload Textures
    let aaronHead01Texture = SKTexture(image: UIImage(contentsOfFile:NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent("P01_head01.png"))!)
    let aaronHead02Texture = SKTexture(image: UIImage(contentsOfFile:NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent("P01_head02.png"))!)
    //more textures for body parts of character that will be changed

    var aaronHead: SKSpriteNode!
    //More SKSpriteNodes for other body parts

    override init(size: CGSize){
        super.init(size: size)

        self.aaronHead = SKSpriteNode(texture: self.aaronHead01Texture)
        self.aaronHead.anchorPoint = CGPoint(x: 0.5, y: 0.1)
        self.aaronHead.position = CGPoint(x: 10, y: 284)
        self.aaronHead.zPosition = 1.0
        self.aaronBody.addChild(aaronHead)

    }

1 个答案:

答案 0 :(得分:3)

您已经发现了问题:

  

场景改变后没有调用Deinit。

如果scene确实发生更改,则未调用旧场景的deinit,那就是问题所在。这意味着旧场景仍在记忆中。

这可能是因为您有强保留周期。这意味着您的场景中的孩子(或孩子的孩子......)对场景本身具有强引用

您必须找到该引用并使用weak关键字声明它。