Xcode任何3D引擎均存在内存不断增加的问题

3

编辑:我原以为只有SceneKit有这个问题,但后来我为OpenGL和Metal创建了一个新的Xcode项目,发现这两个引擎也与SceneKit一样存在内存缓慢增长的问题。请问有人能告诉我是怎么回事吗?这正常吗?为什么会这样?

最近我开始使用Scene Kit,每次我使用SCNAction.repeatForever对任何节点进行动画或在渲染循环中更新旋转或位置时,都会在调试会话中显示内存缓慢增加。即使是苹果提供的基本项目,它只是一个简单的喷气式飞机旋转,但内存不断地增加大约0.1 MB每5-10秒。我让它运行了半个多小时,它仍然在不断增加。我还尝试停止动画,但内存并没有被释放。 我尝试了使用多个设备并关闭了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 renderer))之前,内存也会增加。
我将进一步研究这个问题,并在没有内存增加的情况下发布更新,我还向苹果提交了一个关于他们的基础项目自动增加内存的错误报告。
编辑: 如果使用OverlaySKScene的路线并在那里使用更新函数来更新立方体的位置,则内存会增加,而不设置
self.scnView.isPlaying = true

即使魔方已经离开相机视野,内存使用量仍然会增加。

结论: 每当场景中的节点更新时,内存使用量都会增加。

怎么办呢?


如果将操作的持续时间增加到1秒或10秒,会发生什么?为什么需要每1/60秒新的操作?使用内存图检查器,您是否看到随时间的变化? - Hal Mueller
动作通常是一种在非常原始的意义和方式上制作模块化动画的快捷方式。我认为它们没有经过深思熟虑,也没有在最初的构思中考虑周全。动作的起源是从cocos2D借鉴来的。它们真的不适合用于帧或三个帧的持续时间。尝试覆盖update()函数以执行此类每帧动画。https://developer.apple.com/reference/scenekit/scnscenerendererdelegate - Confused
我尝试每60秒使用该操作,但内存使用量仍然相同。我将代码 code rot += 0.01 self.cubeNode.eulerAngles = SCNVector3Make(rot, 0, 0) 移动到Sprite Kit更新中,但内存使用量仍然增加。 - Pete
2019年12月22日,问题仍然存在。 - Hope
2个回答

0

2019年12月22日问题仍然存在。 - Hope

0

是的,我遇到了完全相同的问题,并且能够得出与您完全相同的结论: SCNAction.repeatForever() "吃掉"内存。
也许向苹果报告一个错误?

此外,其他SCNActions似乎存在问题...(我需要调查一下) 我还没有解决方法。 我尝试用CABasicAnimation()替换SCNActions,结果出现了完全相同的问题(旋转吃内存):

let rot = CABasicAnimation(keyPath: "eulerAngles.z")
rot.byValue = r
rot.duration = time
rot.repeatCount = .infinity
self.addAnimation(rot, forKey: "rotendless")

问题不仅出现在操作上,因为如果我不使用这些操作并通过更新函数(无论是旋转还是位置)来更新立方体,内存也会增加。好像只要场景得到视觉更新,内存就会增加。当我在SpriteKit中移动精灵时,我没有遇到这个问题。似乎只有SceneKit有这个问题。 - Pete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接