Swift:转换到新场景后取消分配 GameScene?

2024-01-20

所以我读过几个关于这个问题的问题,但大多数都是 Objective-C 的,我还没有找到任何直接解决/回答这个问题的问题。 我是这里编程的新手,所以请彻底解释任何建议。

我需要了解如何解除分配游戏结束后我的游戏场景到达。我需要这样做的原因是因为游戏结束后,我过渡到一个新的 SKScene(游戏结束场景),当我过渡回我的 GameScene 时,要么 GameScene 没有完全重置,要么我每次都会生成一个新的 GameScene 。

我这么说是因为每次游戏结束并转换回 GameScene 时,我的每秒帧数都会下降,因此,如果我这样做的次数足够多,我什至无法再玩游戏了。这是个问题。

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

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

我还在这里读到:关闭SKScene后,内存仍然居高不下 https://stackoverflow.com/questions/22704219/after-closing-skscene-memory-remains-high删除包含 SKScene 的 SKView 会取消分配 SKScene,因此当我的 GameScene 和游戏结束场景都保留时,我会从其超级视图中删除这两个视图,如下所示:

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

        self.view.removeFromSuperview()

    }

但每秒帧数的减少并没有任何影响,游戏仍然滞后。我不明白我没有做什么,也无法判断游戏结束场景是否是问题所在,或者我只是没有取消分配 GameScene。

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

EDIT:

每次我转换回 GameScene 时,我的节点数和绘制数都保持大致相同,因此这似乎不是问题。我尝试测试是否deinit在场景之间转换时被调用(我没有deinit之前)在 GameScene 类中使用它:

} //<**End of GAMESCENE**

    deinit {
        print("Deinit was called")
    } 

并且没有打印任何内容deinit没有被调用。

EDIT 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,并且由于此时没有任何对象不使用我的场景,所以引用计数变为零并且场景被删除。

The SKSceneobject 是一个普通的类对象并且ARC像处理所有引用类型对象一样处理它们。您只需要监控场景的引用数量。一切都完成了我开始的各种资源deinit of SKScene object

简单的例子:

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

At GameScene in deinit打印一些文本以表明该对象将被删除:

class GameScene: SKScene {
   ...
    
    deinit {
        print("Deinit scene")
    }
}

推送后调试输出nextSceneAction button:

下一个场景

删除场景

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift:转换到新场景后取消分配 GameScene? 的相关文章

随机推荐

  • 为arm64构建OpenSSL FIPS

    我找到了为arm64构建非FIPS openssl的参考 但我需要构建FIPS版本 项目如https github com GotoHack iOS openSSL FIPS https github com GotoHack iOS op
  • 运算符不存在:json = json

    当我尝试从表中选择一些记录时 SELECT FROM movie test WHERE tags dramatic women political json sql代码抛出错误 LINE 1 SELECT FROM movie test W
  • 通过注释抑制 IntelliJ IDEA 中的重复警告

    从版本 15 开始 IntelliJ 警告我有关代码重复的问题 https www jetbrains com help idea 2016 1 analyzing duplicates html origin old help 在某些情况
  • 如何在android中点击按钮打开下面的自定义布局对话框?

    我想在点击按钮下方创建下拉自定义对话框 单击计数器按钮 布局将显示在按钮下方 我看到了很多链接 但他们只打开列表 操作栏下拉打开和关闭项目样式 https stackoverflow com questions 15824793 actio
  • 如何在 Python 中创建通用接口?

    我想在 Python 中创建与此等效的内容 static class Event static class MyEvent extends Event interface Filter
  • React / Redux:mapStateToProps 实际上并未将状态映射到 props

    我在一个项目中使用 React 和 Redux 但在实现启用 禁用按钮的功能时遇到问题 我已经能够 触发一个方法 让该方法触发动作创建者 调度一个动作 在减速器中捕获该操作并创建一个新的更新状态 在 Redux DevTools 中查看更新
  • 在 for 循环中引用/取消引用向量元素

    在下面的代码中 我想保留number list 迭代之后 因为 into iter that for默认使用会消耗 因此 我假设n i32我可以获得的值n通过解除引用 fn main let number list vec 24 34 10
  • 如何在JTable中添加JCheckBox?

    首先 我为我的英语疏忽表示歉意 我将解释我所有的问题 首先我想在我拥有的 JTable 中使用 JCheckBox 我正在从数据库的列索引 0 和 1 中检索学生 ID 和学生姓名 我希望第三列应该是缺席 在场 最初将通过 JCheckbo
  • TinyMCE - 附加到通过 AJAX 调用加载的 div

    我知道以前有人问过这个问题 但我正在尝试通过 jQuery AJAX 加载一些附加到 tinymce 实例的 div 在AJAX加载的页面中 有几个tinymce div 它们是由PHP循环创建的 div p Some text p div
  • 无法在 C# 中使用 Sendkeys 发送下划线?

    我很无聊 所以我尝试编写一个程序 在按 ctrl shift L 时写出不赞成的笑脸 脸 现在一切正常 除了笑脸中的下划线 它根本不会被写出来 这是我首先使用的 SendKeys Send 我尝试过各种方法 比如在下划线周围添加 括号 当然
  • R/Igraph 在边列表中显示边权重?

    当将图形对象作为边列表查看时 有什么方法可以显示边权重吗 我想本着以下精神做一些事情 get edgelist graph attr weight 以便查看与节点旁边列出的权重的边缘配对 但这似乎是不允许的 我知道如何查看权重的唯一方法是将
  • iPhone:当其他视图存在ViewController时如何防止关闭键盘

    我的 iPhone 应用程序出现问题 有一个 2UIViewController First UIViewController with UITextField和键盘向上 一旦我将打开其他UIViewController有了presentV
  • 为什么我需要在 swift 中使用下划线?

    Here https www weheartswift com tuples enums 它说 注意 意思是 我不关心那个值 但是来自 JavaScript 我不明白这意味着什么 我可以打印这些函数的唯一方法是在参数之前使用下划线 func
  • Rx.Net - 处理 Observable.Create() 期间创建的资源

    我正在尝试将 Rx net 用于项目 但我遇到了如何正确处置在Observable Create 并发出OnNext 我的设置如下所示 希望仅缩短到相关位 var obs Observable Create
  • 设置gunicorn与systemd一起运行

    正在尝试设置gunicorn与一起运行systemd 控制文件是 etc systemd system gunicorn service测试的输出是 root samuel pc systemctl start gunicorn Faile
  • git Notes 是将类别样式信息添加到提交的预期方法吗?

    答案是我可以将元数据添加到 git 提交吗 或者我可以在 gitk 中隐藏一些标签吗 https stackoverflow com questions 2683248 can i add metadata to git commits o
  • 这段代码定义明确吗?

    这段代码取自正在进行的讨论here https stackoverflow com questions 4638364 undefined behavior and sequence points reloaded 4638718 4638
  • 如何每周发送 100,000 封电子邮件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从 AJAX 请求返回值? [复制]

    这个问题在这里已经有答案了 我有一个函数声明一个变量var关键词 然后 它启动 AJAX 请求来设置变量的值 然后从函数返回该变量 然而 我的实施失败了 我不知道为什么 这是代码的简化版本 function sendRequest some
  • Swift:转换到新场景后取消分配 GameScene?

    所以我读过几个关于这个问题的问题 但大多数都是 Objective C 的 我还没有找到任何直接解决 回答这个问题的问题 我是这里编程的新手 所以请彻底解释任何建议 我需要了解如何解除分配游戏结束后我的游戏场景到达 我需要这样做的原因是因为