【问题标题】:Xcode any 3D engine constant slow memory increaseXcode 任意 3D 引擎不断缓慢增加内存
【发布时间】: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


【解决方案1】:

是的。我的经历完全相同,并且能够得出与您完全相同的结论: 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")

【讨论】:

  • 这不仅仅是导致问题的动作,因为如果我不使用它们并通过更新函数更新多维数据集,无论是旋转还是位置,内存都会增加。就像场景在所有内存中都在视觉上更新一样。当我在 spritekit 的场景中移动精灵时,我没有这个问题。好像场景套件有这个问题。
【解决方案2】:

显然苹果已经意识到了这一点,他们将在 10.2 中修复它

https://forums.developer.apple.com/thread/64295

https://forums.developer.apple.com/thread/67384

编辑: Apple 已在最新的 Xcode 版本中修复了此问题。

【讨论】:

  • 2019 年 12 月 22 日问题仍然存在。
猜你喜欢
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2014-06-14
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多