2016-11-25 21 views
2

編輯:我想也許它只是SceneKit,但後來我做了一個新的OpenGL和金屬的Xcode項目,這兩個引擎都有與SceneKit相同的問題,內存緩慢增加。有人能告訴我怎麼回事?這是正常的嗎?爲什麼?Xcode的任何3D引擎不斷慢記憶增加

我最近開始使用場景工具包,每次使用SCNAction.repeatForever爲任何節點設置動畫或使用渲染循環更新旋轉或位置時,調試會話中顯示的內存緩慢逐漸增加。這甚至會發生在蘋果提供的基礎項目中,它就像噴氣旋轉一樣簡單,但是內存每5-10秒增加約0.1毫巴。我已經讓它跑了半個多小時,而且還在不斷增加。我也嘗試停止動畫,並且內存不會被釋放。使用多個設備我用盡轉身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) 
    } 

有其他人注意到了這個問題?我能做些什麼嗎?任何想法,建議或意見,非常感謝!

編輯: 我注意到: 如果我不使用動作,而是去更新功能的路線。 只要我有這行代碼:

self.scnView.isPlaying = true 

即使我沒有在現場,甚至在我添加任何其他代碼,如設置委託或添加更新功能(FUNC渲染改變什麼)內存升高。

我將進一步研究這個問題,如果我在沒有增加內存的情況下發布更新,我還向蘋果提交了一個關於他們的基礎項目的錯誤報告,在您構建和運行它時很快就會自動增加內存。

編輯: 如果去使用OverlaySKScene並使用更新功能有更新立方體的位置的路線,該內存上漲,甚至沒有立方體後設置

self.scnView.isPlaying = true 

這就是超出相機的內存仍然上升。

結論: 任何時候節點在場景中的更新內存都會增加。

怎麼辦?

+0

如果將動作的持續時間增加到1秒或10秒,會發生什麼情況?爲什麼每1/60秒需要一個新的動作?您是否看到使用Memory Graph Inspector隨時間的變化? –

+0

一般來說,動作是以非常原始的意義和方式製作模塊化動畫的捷徑。我認爲他們沒有經過深思熟慮,也沒有考慮到他們的第一個例子。行動觀念的起源是從cocos2D借來的。而且他們真的不適合用於一幀或三幀的持續時間。嘗試覆蓋update()函數來完成這種每幀動畫。 https://developer.apple.com/reference/scenekit/scnscenerendererdelegate – Confused

+0

我試着每60秒使用一次動作,並且內存仍然保持不變。我將代碼'code rot + = 0.01 self.cubeNode.eulerAngles = SCNVector3Make(rot,0,0)'移動到精靈套件更新並且內存仍然上升。 – Pete

回答

0

是的。我的體驗完全一樣,並能夠得出與您完全相同的結論: SCNAction.repeatForever()「吃」內存。
可能是蘋果的文件bug?

另外其他SCNActions似乎有問題...(我必須調查這一點) 我還沒有解決這個問題。我試着用CABasicAnimation(),以取代SCNActions - 這就造成了完全相同的問題(旋轉吃內存):

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

這不僅僅是導致問題的動作,因爲如果我不使用它們並通過更新函數更新多維數據集,那麼它的旋轉或位置會使內存上升。就好像場景在所有內存都可視化更新一樣。當我在spritekit的場景中移動一個精靈時,我沒有這個問題。就好像現場套件有這個問題。 – Pete