SKSprite 场景的内存问题

Posted

技术标签:

【中文标题】SKSprite 场景的内存问题【英文标题】:Memory Issues with SKSprite Scenes 【发布时间】:2016-01-06 21:24:53 【问题描述】:

当我尝试在两个场景之间转换时,内存会增加。没有解除分配。我尝试调用 skView.removeFromSuperview() 但屏幕变黑。这是我的代码:

func goGame()


    //crowdImage.hidden = true
    imageView.removeFromSuperview()
    scene?.removeAllActions()
    scene?.removeAllChildren()
    scene?.removeFromParent()
    //view.removeFromSuperview()
    if myviewbool == 0
    

        if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene 
            skView = self.view as! SKView
            skView.frameInterval = 2
            skView.ignoresSiblingOrder = false
            scene.viewController = self
            scene.scaleMode = .AspectFill
            skView.presentScene(scene, transition: SKTransition.crossFadeWithDuration(1))
        
        skView2.scene?.removeFromParent()
        //skView2.removeFromSuperview() // CAUSES BLACK SCREEN
    
    if myviewbool == 1
    

        if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene 
            skView2 = self.view as! SKView
            skView2.frameInterval = 2
            skView2.ignoresSiblingOrder = false
            scene.viewController = self
            scene.scaleMode = .AspectFill
            skView2.presentScene(scene, transition: SKTransition.crossFadeWithDuration(1))

        
        skView.scene?.removeFromParent()
        //skView.removeFromSuperview() // CAUSES BLACK SCREEN
    


当游戏结束时,我调用 func gameEnd() 来切换 myviewbool 变量并调用 goGame()。任何帮助深表感谢! ;-)

func gameEnded()

    if myviewbool == 0
    
        myviewbool = 1
    
    else
    
        myviewbool = 0
    
    isGamePlaying = false
    goGame()


最终我收到内存警告...然后应用程序崩溃。

【问题讨论】:

顺便说一句:我正在切换两个视图,因为我认为这可以解决我的记忆问题。但与使用 1 个视图的结果相同。 :( 我们需要更多信息在这里,你现在能做的最好的事情是在你的游戏场景类中覆盖 deinit,并放入一个 print("Scene Deinit") 这会告诉你场景是否被移除。如果不是,您可能有一些东西来保存它,例如块、计时器或通知处理程序 感谢奈特!会试试的! 【参考方案1】:

因此,在花费大量时间尝试调试导致内存问题的原因之后,它最终成为了 NSTimers。感谢 KnightOfDragon 让我走上了正确的道路。尽管我会在加载新场景之前尝试使每个计时器无效,但计时器从未卸载并在后台继续运行。 deinit 函数从未被调用,因此场景从未被卸载。我能得到的唯一解决方案是根本不使用 NSTimers,而是在这里使用这个自定义类:https://github.com/mattneub/Programming-ios-Book-Examples/blob/master/bk1ch12p499timerLeaker2/ch12p325NotificationLeaker/CancelableTimer.swift

希望这对将来的某人有所帮助。这让我轻松地花费了 40 个小时的工作时间。 :(

【讨论】:

你应该使用一个或两个SKAction

以上是关于SKSprite 场景的内存问题的主要内容,如果未能解决你的问题,请参考以下文章

检查没有物理实体的 SKSprite 节点之间的碰撞

安卓内存分析——常见内存泄漏场景二

在随机位置生成 SKSprite

将 SKSprite 的图像更改为 SKShapeNode

Swift 使 sksprite 节点随时间移动得更快

MySQL内存不释放分析