编辑:我想也许只是SceneKit,但后来我为OpenGL和Metal制作了一个新的Xcode项目,这两个引擎都有与SceneKit相同的问题,内存慢慢增加。有人可以告诉我这有什么意义吗?这是正常的吗?为什么呢?
我最近开始使用场景工具包,每次使用SCNAction.repeatForever为任何节点设置动画或使用渲染循环更新旋转或位置时,调试会话中显示的内存缓慢逐渐增加。这甚至发生在苹果公司提供的基础项目中,它简单如喷射旋转,但记忆每5-10秒连续增加约0.1 mb。我已经让它运行了半个多小时而且它一直在增加。我也尝试停止动画,内存不会被释放。我尝试过使用多个设备并转为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渲染器))之前,内存也会上升。
我将进一步研究这个问题,并且如果我在没有内存增加的情况下工作就会发布更新,我还向苹果提交了一个关于他们的基础项目的错误报告,在你构建和运行它时会立即自动增加内存。
编辑: 如果使用OverlaySKScene的路线并使用更新功能来更新立方体的位置,内存会上升,那就是没有设置
self.scnView.isPlaying = true
即使在立方体离开相机后,内存仍然会上升。
结论: 无论何时在场景中更新节点,内存都会上升。
怎么办?
答案 0 :(得分:0)
是。我经历了完全相同的事情,并且能够将其归结为与您完全相同的结论:
SCNAction.repeatForever()"吃掉"记忆。
可能会向Apple提出错误?
其他SCNActions似乎也有问题......(我必须对此进行调查) 我还没有解决方案。我试图用CABasicAnimation()替换SCNActions - 这导致完全相同的问题(旋转吃内存):
let rot = CABasicAnimation(keyPath: "eulerAngles.z")
rot.byValue = r
rot.duration = time
rot.repeatCount = .infinity
self.addAnimation(rot, forKey: "rotendless")