我一直在努力修复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的记忆图:
正如您所看到的,我的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)
}
答案 0 :(得分:3)
您已经发现了问题:
场景改变后没有调用Deinit。
如果scene
确实发生更改,则未调用旧场景的deinit
,那就是问题所在。这意味着旧场景仍在记忆中。
这可能是因为您有强保留周期。这意味着您的场景中的孩子(或孩子的孩子......)对场景本身具有强引用。
您必须找到该引用并使用weak
关键字声明它。