加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift:转换到新场景后释放GameScene?

发布时间:2020-12-14 04:54:38 所属栏目:百科 来源:网络整理
导读:所以我已经阅读了几个关于此问题的问题,但大多数是在Objective-C中,我没有找到任何直接解决/回答的问题. 我是新手编程,所以请彻底解释任何建议. 我需要了解如何在游戏结束后解除分配我的GameScene.我需要这样做的原因是因为在游戏结束后,我转换到新的SKScene
所以我已经阅读了几个关于此问题的问题,但大多数是在Objective-C中,我没有找到任何直接解决/回答的问题.
我是新手编程,所以请彻底解释任何建议.

我需要了解如何在游戏结束后解除分配我的GameScene.我需要这样做的原因是因为在游戏结束后,我转换到新的SKScene(场景中的游戏),当我转换回我的GameScene时,GameScene不会完全重置或者我每次都会生成一个新的GameScene .

我之所以这么说是因为每次游戏结束时我的每秒帧数都会下降并转换回GameScene,所以如果我做了足够多次,我甚至不能再玩游戏了.这是个问题.

我不明白为什么会发生这种情况,因为当我在场景中过渡到我的游戏时,我会删除GameScene中的所有内容:

self.viewController!.performSegueWithIdentifier("goToGameOver",sender: nil)
            self.removeAllChildren()
            self.removeAllActions()
            self.scene?.removeFromParent()

我还在这里阅读:After Closing SKScene,Memory Remains High删除包含SKScene的SKView会释放SKScene,所以当我的GameScene和场景游戏都离开时,我会从他们的超级视图中删除两个视图,如下所示:

override func viewDidDisappear(animated: Bool) {
        print("its gone")

        self.view.removeFromSuperview()

    }

但是对于每秒减少的帧数并没有任何影响,游戏仍然滞后.我不明白我在做什么,也无法判断场景中的游戏是否是问题,或者我只是不解除GameScene的负责.

如何释放GameScene?我还应该做什么?

编辑:

每次我转换回GameScene时,我的节点数和绘制数都保持不变,所以这似乎不是问题.我尝试在GameScene类中使用它来测试在场景之间转换时是否调用了deinit(之前我没有使用过deinit):

} //<**End of GAMESCENE**

    deinit {
        print("Deinit was called")
    }

没有任何东西被印刷,因此没有被称为deinit.

编辑2:

@alex_p这是我在GameViewController中的内容 –

class GameViewController: UIViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver {

    var scene1: GameScene?
    var scene2: GameScene?
    var skView: SKView?

// Action to present next Scene
    @IBAction func nextSceneAction(sender: AnyObject) {
        print("Next scene")
        // Create new GameScene object
        scene2 = GameScene(fileNamed:"GameScene")
        // Present scene2 object that replace the scene1 object
        skView!.presentScene(scene2) //ERROR ON THIS LINE
        scene1 = nil
    }

我从我的GameScene中调用这个方法是这样的:

self.viewController.nextSceneAction(self)

我完全复制了你的,但我收到了意外发现的错误nil,同时在上面评论的行上展开了一个Optional值.在没有被召唤的情况下离开.

解决方法

在我的项目中,我使用了以下机制并且运行良好.我的所有场景SKScene对象都是可选变量.当我需要显示新场景时,我创建它并在SKView上呈现.当我需要显示新场景时,我将前一个对象场景对象设置为nil,这会立即将引用计数减少1,并且由于此时没有一个对象没有使用我的场景,引用计数变为零并且场景被删除了.

SKScene对象是一个普通的类对象,ARC与它们一样使用所有引用类型对象.您只需要监视场景的引用数量.所有这些都完成了我从SKScene对象开始的各种资源

简单的例子:

在UIViewController,我们有GameScene的可选对象:

class GameViewController: UIViewController {
    var scene1: GameScene?
    var scene2: GameScene?
    var skView: SKView?

    // Action to present next Scene
    @IBAction func nextSceneAction(sender: AnyObject) {
        print("Next scene")
        // Create new GameScene object
        scene2 = GameScene(fileNamed:"GameScene")
        // Present scene2 object that replace the scene1 object
        skView!.presentScene(scene2)
        scene = nil
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Create GameScene object
        scene = GameScene(fileNamed:"GameScene")
        skView = (self.view as! SKView)
        skView!.showsFPS = true
        skView!.showsNodeCount = true

        skView!.ignoresSiblingOrder = true

        scene!.scaleMode = .AspectFill

        // Present current scene
        skView!.presentScene(scene)
    }
}

在GameScene的deinit中打印一些文本以显示它将被删除的对象:

class GameScene: SKScene {
   ...

    deinit {
        print("Deinit scene")
    }
}

按下nextSceneAction按钮后调试输出:

Next scene

Deinit scene

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读