编辑:我原以为只有SceneKit有这个问题,但后来我为OpenGL和Metal创建了一个新的Xcode项目,发现这两个引擎也与SceneKit一样存在内存缓慢增长的问题。请问有人能告诉我是怎么回事吗?这正常吗?为什么会这样?
最近我开始使用Scene Kit,每次我使用SCNAction.repeatForever对任何节点进行动画或在渲染循环中更新旋转或位置时,都会在调试会话中显示内存缓慢增加。即使是苹果提供的基本项目,它只是一个简单的喷气式飞机旋转,但内存不断地增加大约0.1 MB每5-10秒。我让它运行了半个多小时,它仍然在不断增加。我还尝试停止动画,但内存并没有被释放。 我尝试了使用多个设备并关闭了scnView.showsStatistics = false
我所看到的引起问题的代码是:
self.cubeNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 0.01, z: 0, duration: 1.0/60.0)))
或者
func renderer(_ aRenderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
rot += 0.01
self.cubeNode.eulerAngles = SCNVector3Make(rot, 0, 0)
}
有人注意到这个问题吗?我能为此做些什么吗?欢迎提出任何想法、建议或意见!
编辑: 我注意到: 如果不使用Actions而是选择更新函数的路线。 只要代码中有这一行:
self.scnView.isPlaying = true
即使在场景中不做任何更改,甚至在添加任何其他代码(如设置委托或添加更新函数(func renderer))之前,内存也会增加。
我将进一步研究这个问题,并在没有内存增加的情况下发布更新,我还向苹果提交了一个关于他们的基础项目自动增加内存的错误报告。
编辑: 如果使用OverlaySKScene的路线并在那里使用更新函数来更新立方体的位置,则内存会增加,而不设置
self.scnView.isPlaying = true
即使魔方已经离开相机视野,内存使用量仍然会增加。
结论: 每当场景中的节点更新时,内存使用量都会增加。
怎么办呢?
code rot += 0.01 self.cubeNode.eulerAngles = SCNVector3Make(rot, 0, 0)
移动到Sprite Kit更新中,但内存使用量仍然增加。 - Pete