我在這裏沒有想法,SceneKit在內存上堆積如山,我只是開始了。我顯示的是SNCNodes
,它們存儲在數組中,所以我可以分離動畫分子的各個組成部分。這些樹模型我最終可能會顯示50個分子,每個「章節」說一個。問題是,當我轉到另一章時,前幾章的分子持續記憶。SceneKit:太多內存持續存在
分子節點是子節點的樹。大約一半的節點是用於定位的空容器。否則,幾何形狀是SCNPrimitives
(球體,膠囊和圓柱體)。每個幾何都有一個鏡面和一個由UIColor
組成的漫反射material
,不使用紋理。
當應用第一次啓動時,這些分子是從代碼構建的,並存檔到一本字典中。然後,在後續的引導中,將歸檔字典讀入本地字典供VC使用。 (我在這個崗位爲簡潔移除的安全功能。)
moleculeDictionary = Molecules.readFile() as! [String: [SCNNode]]
當一個章節要顯示一個分子,它調用加載從本地詞典給定的分子所需的組件到本地SCNNode
特定功能屬性。
// node stores (reuseable)
var atomsNode_1 = SCNNode()
var atomsNode_2 = SCNNode()
. . .
func lysozyme() { // called by a chapter to display this molecule
. . .
components = moleculeDictionary["lysozyme"]
atomsNode_1 = components[0] // protein w/CPK color
baseNode.addChildNode(atomsNode_1)
atomsNode_2 = components[2] // NAG
baseNode.addChildNode(atomsNode_2)
. . .
}
要顯示的下一個分子之前,我所說的「清理」功能:
atomsNode_1.removeFromParentNode()
atomsNode_2.removeFromParentNode()
. . .
當我在儀器研究,最臃腫的內存是32KB的塊由C3DMeshCreateFromProfile
稱爲和80kB大小的C3DMeshCreateCopyWithInterleavedSources
。
我也有泄漏我需要跟蹤哪些是可追溯到檔案的解碼的NSKeyedUnarchiver
。所以我也需要處理這些,但它們只是積累每個分子呼叫的記憶使用的一小部分。
如果我回到先前查看的分子,內存使用量不會再增加,它會累積並持續存在。
我試過宣佈atomsNode_1
及其親屬作爲可選項,然後在清理時將它們設置爲零。沒有幫助。我試過,在清理功能,
atomsNode_1.enumerateChildNodesUsingBlock({
node, stop in
node.removeFromParentNode()
})
好了,記憶又回到下降,但節點似乎現在從加載的字典中永遠消失。該死的參考類型!
因此,也許我需要一種方法來存檔[SCNNode]
數組,以解壓和單獨檢索它們。在這種情況下,我會將它們從內存中清除,並在重新訪問該分子時從存檔中重新加載。但我還不知道如何去做這些。在投入更多時間感到沮喪之前,我會很感激這方面的意見。
哈爾,感謝您的反饋。盒子不會削減它,它對分子顯示器來說看起來非常不正統。在一些模型上,我可能會減少多邊形數量,但是我會有儘可能多的模型,在長期運行中效率不會很高。我真的需要防止模型積累。我認爲每次閱讀它們都是潛在的解決方案,但到目前爲止,我只設法將它們一起保存在一本字典中。有節點在數組中的動畫原因加上:它沒有更多的內存(我測試過)加上比枚舉更快的動畫。 – bpedit
所以,我真的很喜歡你的想法:「一堆嵌入資源的節點樹......」。事實上,我已經在這裏發佈了2個問題,如何做到這一點,但沒有收到任何迴應!建議歡迎!再次感謝,Byrne – bpedit
用一些示例代碼編輯。您可能會搔癢SceneKit內存循環; http://stackoverflow.com/questions/32997711/removing-scnnode-does-not-free-memory-before-creating-new-scnnode?rq=1可能是一回事。作爲一種解決方法,您可以嘗試銷燬/重新創建SCNScene或SCNView。 –