gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:26 27 4
gpt4 key购买 nike

所以我已经阅读了几个关于此的问题,但大多数都是在 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 和游戏结束场景都被保留时,我会像这样从它们的 super View 中删除两个 View :

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)

我完全复制了你的,但我在上面评论的行中收到错误 unexpectedly found nil while unwrapping an Optional value。 Deinit 未被调用。

最佳答案

在我的项目中,我使用了以下机制并且效果很好。我所有的场景 SKScene 对象都是可选变量。当我需要显示新场景时,我会创建它并显示在 SKView 上。当我需要显示新场景时,我将之前的对象场景对象设置为nil,这立即将引用计数减1,因为此时没有任何对象不使用我的场景,引用计数变为零,场景被删除。

SKScene 对象是一个普通的类对象,ARC 像处理所有引用类型对象一样处理它们。您只需要监视对场景的引用数。所有这些都完成了我在 SKScene 对象的 deinit 中启动的各种资源

简单的例子:

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)
}
}

GameScenedeinit 中打印一些文本以表明它的对象将被删除:

class GameScene: SKScene {
...

deinit {
print("Deinit scene")
}
}

按下 nextSceneAction 按钮后的调试输出:

Next scene

Deinit scene

关于Swift:转换到新场景后释放 GameScene?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33452980/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com