在场景中有几个子节点,并快速转换到新场景。
在新场景中,didMove(to view: ….)
用于将前一场景中的孩子添加到下一个场景。
SceneKit在快速执行此操作时崩溃,似乎是因为旧场景的孩子尚未被释放。
如果我在将孩子添加到第二个场景之前添加一点延迟,那很好......似乎SpriteKit没有足够快地释放孩子进行场景转换。
以上是关于这个问题的目的最重要的事情。我(错误地)假设SpriteKit会确保在尝试将它们添加到后续场景之前释放连接到场景的所有节点。它没有这样做。但它确实释放了它们,只需要一点时间。这是一帧吗?一秒?说不上... 的
我的场景转换时间为0.25秒
还尝试在原始场景中使用willMove(to view: ….)
手动删除子项。这也行不通,看似相同的行为:不够快。
还尝试假设孩子仍然与其父母有关系,所以尝试移动到新的父母,新场景,move(toParent:…)
这也会崩溃。因此,我想也许这些孩子已被标记为即将被释放。
这是否已知,如果是,它是如何处理的?
答案 0 :(得分:2)
您无法在同一帧(SK循环)中同时呈现场景并具有willMove
功能 - 在上一场景被摧毁之前,您的下一个场景viewDidLoad
将被调用。在调用presentScene
之前,您必须删除所有节点:
我建议创建某种全局变量来访问SKView
;这样你就可以从任何地方控制你的场景:
currentScene.removeAllChildren()
gView!.presentScene(nextScene)
答案 1 :(得分:0)
“这是一个众所周知的,如果是这样,它是如何处理的?"
是,这是SceneKit和IOS设计和操作范例的已知问题。认为场景必须始终存在于屏幕上。在屏幕上没有场景的情况下没时间。
因此,在转换期间的短暂时间内,两个场景都被加载并激活。
在执行转换之前删除旧场景中的所有内容,以便可以通过didMove(to view...
或
等待完成转换,然后将旧场景中的任何内容加载到新场景中,以免儿童发生所有权冲突。
或
KnightOfDragon第一个使用.copy()
的建议,所以没有相同的实例被场景争夺。