【发布时间】:2017-04-09 12:07:30
【问题描述】:
编辑:我以为可能只是 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
即使在立方体离开相机后,内存仍然会增加。
结论: 任何时候更新场景内存中的节点都会增加。
怎么办?
【问题讨论】:
-
如果将动作的持续时间增加到 1 秒或 10 秒会怎样?为什么每 1/60 秒需要一个新动作?使用 Memory Graph Inspector,您是否看到随时间发生的任何变化?
-
动作,一般来说,是以一种非常原始的感觉和方式制作模块化动画的捷径。我不认为他们是经过深思熟虑的,也不是一开始就构思出来的。动作概念的起源是从 cocos2D 中借来的。而且它们真的不太适合用于一帧或三帧的持续时间。尝试覆盖 update() 函数来执行这种逐帧动画。 developer.apple.com/reference/scenekit/scnscenerendererdelegate
-
我尝试每 60 秒使用一次该操作,但内存仍然上升。我将代码
code rot += 0.01 self.cubeNode.eulerAngles = SCNVector3Make(rot, 0, 0)移到了精灵套件更新中,但内存仍在增加。 -
2019 年 12 月 22 日,问题仍然存在
标签: ios xcode animation memory scenekit