Children 个场景发布速度不够快?
Children of a Scene not releasing fast enough?
场景中有几个 child 节点,并快速过渡到新场景。
在新场景中,didMove(to view: ….)
用于将上一个场景的children添加到下一个场景。
SceneKit 快速执行时崩溃,似乎是因为旧场景的 children 尚未发布。
如果我在将 children 添加到第二个场景之前稍微延迟一下,没关系……似乎 SpriteKit 没有发布 child 足够快的场景转换。
以上是关于这个问题的目的最重要的理解。我(错误地)假设 SpriteKit 会确保在尝试将它们添加到后续场景之前释放所有附加到场景的节点。它不会这样做。但它确实释放了它们,只是需要一点时间。这是一帧吗?一秒?不知道...
我的场景转换时间是0.25秒
也尝试在原场景中使用willMove(to view: ….)
手动移除children。这也不起作用,看似相同的行为:不够快。
还尝试假设 child 仍然与其 parent 有关系,所以尝试移动到它的新 parent,新场景,move(toParent:…)
这也是崩溃。所以也许 children 已经被标记为即将发布,我想。
是否知道这件事?如果知道,如何处理?
您不能在同一帧中同时呈现一个场景并具有 willMove
功能(SK 循环)--您的下一个场景的 viewDidLoad
将在前一个场景被调用之前被调用被毁。在调用 presentScene
:
之前,您必须删除所有节点
我建议制作某种全局变量来访问您的SKView
;这样你就可以从任何地方控制你的场景:
currentScene.removeAllChildren()
gView!.presentScene(nextScene)
“Is this a known about, and if so, how is it dealt with?"
是,这是 SceneKit 和 IOS 设计和操作范例的已知问题。人们认为场景必须始终存在并出现在屏幕上。不能没有屏幕上的场景。
因此,在过渡期间的短时间内,两个场景都已加载并处于活动状态。
有3种方法可以解决这个问题:
在执行转换之前从旧场景中删除所有内容,以便它可以立即由 didMove(to view...
中的新场景加载
或
等待转换完成,然后再将旧场景中的任何内容加载到新场景中,这样就不会有子项的所有权冲突。
或
KnightOfDragon 第一次建议使用.copy()
所以不会有相同的实例被场景争夺
场景中有几个 child 节点,并快速过渡到新场景。
在新场景中,didMove(to view: ….)
用于将上一个场景的children添加到下一个场景。
SceneKit 快速执行时崩溃,似乎是因为旧场景的 children 尚未发布。
如果我在将 children 添加到第二个场景之前稍微延迟一下,没关系……似乎 SpriteKit 没有发布 child 足够快的场景转换。
以上是关于这个问题的目的最重要的理解。我(错误地)假设 SpriteKit 会确保在尝试将它们添加到后续场景之前释放所有附加到场景的节点。它不会这样做。但它确实释放了它们,只是需要一点时间。这是一帧吗?一秒?不知道...
我的场景转换时间是0.25秒
也尝试在原场景中使用willMove(to view: ….)
手动移除children。这也不起作用,看似相同的行为:不够快。
还尝试假设 child 仍然与其 parent 有关系,所以尝试移动到它的新 parent,新场景,move(toParent:…)
这也是崩溃。所以也许 children 已经被标记为即将发布,我想。
是否知道这件事?如果知道,如何处理?
您不能在同一帧中同时呈现一个场景并具有 willMove
功能(SK 循环)--您的下一个场景的 viewDidLoad
将在前一个场景被调用之前被调用被毁。在调用 presentScene
:
我建议制作某种全局变量来访问您的SKView
;这样你就可以从任何地方控制你的场景:
currentScene.removeAllChildren()
gView!.presentScene(nextScene)
“Is this a known about, and if so, how is it dealt with?"
是,这是 SceneKit 和 IOS 设计和操作范例的已知问题。人们认为场景必须始终存在并出现在屏幕上。不能没有屏幕上的场景。
因此,在过渡期间的短时间内,两个场景都已加载并处于活动状态。
有3种方法可以解决这个问题:
在执行转换之前从旧场景中删除所有内容,以便它可以立即由
中的新场景加载didMove(to view...
或
等待转换完成,然后再将旧场景中的任何内容加载到新场景中,这样就不会有子项的所有权冲突。
或
KnightOfDragon 第一次建议使用
.copy()
所以不会有相同的实例被场景争夺