游戏重新启动时FPS持续下降

3
我正在使用SpriteKit构建一个新游戏,每次想要重新开始游戏时,我会切换场景。因此,每次我按“再玩一次”时,我的GameScene就会从头开始加载,这会导致我的FPS不断下降。
因此,由于每次我都必须加载整个新的GameScene和其中的游戏(大部分是生成节点),所以随着时间的推移,这会导致我的FPS下降。如果无法将FPS限制在某个速率,那么我应该不使用在两个场景之间进行过渡。
然而,我尝试了将所有内容保留在1个场景中的方法,但不幸的是,它没有成功,因为每次我按重启时,生成的SKSpriteNodes数量都会增加一倍。因此,每次我再玩一次时,节点的生成和计时器速度都会加快2倍。我不知道如何解决这个问题。
1个回答

5
每次更改场景时,应该将其及其子项从内存中删除。
您可以在场景末尾添加此方法:
deinit {
    print("\n THE SCENE \(type(of: self))) WAS REMOVED FROM MEMORY (DEINIT) \n")
}

如果你在调试控制台中没有看到这个打印信息,可能是因为你的代码中有一个对self的强引用。 你可以按照官方指南“解决闭包的强引用循环”来解决。


@漩涡人们容易受影响,通过别人问问题,我不断地学习,变得更加简明扼要。 - Knight0fDragon
@AlessandroOrnano 每次我切换屏幕时,我都会删除子节点,并且每当它们离开屏幕时也会删除节点,但我不确定是否从内存中删除了它们。请问有人可以告诉我如何从内存中删除内容吗?因为我的卡顿可能是由于CPU使用率过高或者因为我一直在保存东西到内存中。谢谢! - user7208112
@AlessandroOrnano 是的,我看不到它的打印输出。 - user7208112
@user7208112 如我所说,如果你在我的代码中看到这个打印信息,那么你的SKScene及其子节点已被移除。没有必要手动删除所有子节点,因为这是自动引用计数的工作。如果有的话,你必须解决对self的强引用。关于内存,你可以启动文件-打开开发者工具-仪器,在那里你可以监控你的内存状态。 - Alessandro Ornano
@AlessandroOrnano 我终于找到了在从一个场景切换到另一个场景后如何清除我的内存的方法。我使用以下代码:override func wullMoveFrom view { self.removeAllChildren(). self.removeAllActions(). } 但是过了一段时间后,不知何故我的FPS仍然下降,虽然现在时间更长了,但仍然存在这个问题。现在我的deinit打印已经显示出来了,但是过了一段时间后,我的FPS仍然会下降,而我真的不知道此时可能导致这个问题的原因。你有任何想法吗? - user7208112
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接