Xcode 任何 3D 引擎常量缓慢内存增加
Xcode any 3D engine constant slow memory increase
编辑:我想也许它只是 SceneKit 但后来我为 OpenGL 和 Metal 创建了一个新的 Xcode 项目,这两个引擎都有与 SceneKit 相同的问题,内存缓慢增加。有人可以告诉我这是怎么回事吗?正常吗?为什么?
我最近开始使用场景工具包,每次我使用 SCNAction.repeatForever 为任何节点设置动画或使用渲染循环更新旋转或位置时,调试会话中显示内存缓慢逐渐增加。这甚至发生在 apple 提供的基础项目中,它像喷气式飞机一样简单旋转,但内存每 5-10 秒持续增加约 .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 渲染器))之前,内存也会增加。
我会进一步调查这个问题,如果我在不增加内存的情况下让它工作,我会 post 更新,我还向 apple 提交了一份关于他们的基础项目在你构建时自动增加内存的错误报告和 运行 它。
编辑:
如果走使用 OverlaySKScene 的路线并在那里使用更新功能来更新立方体的位置,内存会增加,那就是没有设置
self.scnView.isPlaying = true
即使立方体从相机中取出后,内存仍然会增加。
结论:
任何时候在场景内存中更新节点。
怎么办?
是的。我的经历完全一样,并且能够将其归结为与您完全相同的结论:
SCNAction.repeatForever() "eats" 内存。
可能会向 Apple 提交错误?
其他 SCNActions 似乎也有问题...(我必须对此进行调查)
我还没有解决方案。我试图用 CABasicAnimation() 替换 SCNActions - 这导致了完全相同的问题(旋转消耗内存):
let rot = CABasicAnimation(keyPath: "eulerAngles.z")
rot.byValue = r
rot.duration = time
rot.repeatCount = .infinity
self.addAnimation(rot, forKey: "rotendless")
显然 apple 已经意识到了这一点,他们会在 10.2 中修复它
https://forums.developer.apple.com/thread/64295
https://forums.developer.apple.com/thread/67384
编辑:
Apple 已在最新的 Xcode 版本中修复此问题。
编辑:我想也许它只是 SceneKit 但后来我为 OpenGL 和 Metal 创建了一个新的 Xcode 项目,这两个引擎都有与 SceneKit 相同的问题,内存缓慢增加。有人可以告诉我这是怎么回事吗?正常吗?为什么?
我最近开始使用场景工具包,每次我使用 SCNAction.repeatForever 为任何节点设置动画或使用渲染循环更新旋转或位置时,调试会话中显示内存缓慢逐渐增加。这甚至发生在 apple 提供的基础项目中,它像喷气式飞机一样简单旋转,但内存每 5-10 秒持续增加约 .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 渲染器))之前,内存也会增加。
我会进一步调查这个问题,如果我在不增加内存的情况下让它工作,我会 post 更新,我还向 apple 提交了一份关于他们的基础项目在你构建时自动增加内存的错误报告和 运行 它。
编辑: 如果走使用 OverlaySKScene 的路线并在那里使用更新功能来更新立方体的位置,内存会增加,那就是没有设置
self.scnView.isPlaying = true
即使立方体从相机中取出后,内存仍然会增加。
结论: 任何时候在场景内存中更新节点。
怎么办?
是的。我的经历完全一样,并且能够将其归结为与您完全相同的结论:
SCNAction.repeatForever() "eats" 内存。
可能会向 Apple 提交错误?
其他 SCNActions 似乎也有问题...(我必须对此进行调查) 我还没有解决方案。我试图用 CABasicAnimation() 替换 SCNActions - 这导致了完全相同的问题(旋转消耗内存):
let rot = CABasicAnimation(keyPath: "eulerAngles.z")
rot.byValue = r
rot.duration = time
rot.repeatCount = .infinity
self.addAnimation(rot, forKey: "rotendless")
显然 apple 已经意识到了这一点,他们会在 10.2 中修复它
https://forums.developer.apple.com/thread/64295
https://forums.developer.apple.com/thread/67384
编辑: Apple 已在最新的 Xcode 版本中修复此问题。