编辑:我以为可能只是 SceneKit,但后来我为 OpenGL 和 Metal 制作了一个新的 Xcode 项目,这两个引擎都存在与 SceneKit 相同的问题,内存缓慢增加。有人可以告诉我这是怎么回事吗?正常吗?为什么?
我最近开始使用场景工具包,每次我使用 SCNAction.repeatForever 为任何节点设置动画或使用渲染循环更新旋转或位置时,调试 session 中都会显示内存缓慢逐渐增加。这甚至发生在苹果提供的基础项目中,它就像喷气式飞机旋转一样简单,但内存每 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
即使我不更改场景中的任何内容,甚至在我添加任何其他代码(例如设置委托(delegate)或添加更新函数(func 渲染器)之前),内存也会增加。
我会进一步研究这个问题,如果我让它在不增加内存的情况下工作,我会发布更新,我还向苹果提交了一份关于他们的基础项目在你构建和运行它时自动增加内存的错误报告。
编辑:
如果走使用 OverlaySKScene 的路线,并使用那里的更新功能来更新立方体的位置,内存就会上升,那就是没有设置
self.scnView.isPlaying = true
即使在立方体离开相机后,内存仍然会增加。
结论:
任何时候更新场景内存中的节点都会增加。
怎么办?
Best Answer-推荐答案 strong>
是的。我经历了完全相同的事情,并且能够得出与您完全相同的结论:
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")
关于ios - Xcode 任意 3D 引擎不断缓慢增加内存,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/40799067/
|