2015-12-13 68 views
2

更新:對於任何絆倒這一點的人來說,SceneKit似乎具有它可呈現的最大對象數閾值。使用[SCNNode flattenedClone]是幫助增加可以處理的對象數量的好方法。正如@Hal所建議的那樣,我將向Apple提交一份錯誤報告,描述下面討論的性能問題。SceneKit崩潰而沒有詳細的崩潰信息

我對iOS有點新,我目前正在爲我的第一個OS X項目開發一個類。我本質上是創建隨機幾何圖形(如果它們之間的距離≤給定半徑,則彼此連接的空間中的隨機點),並使用SceneKit顯示結果。我已經知道我正在將SceneKit推向極限,但如果我試圖繪製的對象數量過大,整個事件就會崩潰,我不知道如何解釋結果。

我SceneKit場景由默認攝像機,2個照明節點,大約5000 SCNSphere s各自的SCNNode(該圖上的節點)內,然後約50,0000連接它們SCNPrimitiveSCNGeometryPrimitiveTypeLine類型的其也是內SCNNode秒。所有這些節點然後被添加到添加到我的場景中的一個大節點。

該代碼適用於較小數量的球體和連接。

當我跑我的這些規範的應用程序,一切似乎都在執行以下行後工作正常,然後5-10秒:

dispatch_async(dispatch_get_main_queue(), ^{ [self.graphSceneView.scene.rootNode addChildNode:graphNodes]; });

應用程序崩潰,這導致屏幕:this resulting screen

鑑於我對Xcode有所瞭解,並在崩潰時習慣了更詳細的輸出,所以我有點頭痛。我能做些什麼來獲得關於這次事故的更多信息?

回答

1

這確實是簡潔的輸出。你可以通過簡化來攻擊它,直到你不再看到崩潰。

首先,你有沒有在屏幕上看到任何東西?

其次,您的來電

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.graphSceneView.scene.rootNode addChildNode:graphNodes]; 
}); 

仍然運行在主隊列,所以我希望它使感知速度和響應能力沒有差別。因此,請將addChildNode:從GCD塊中取出並直接調用它。這有什麼區別嗎?至少,你會立即看到你的崩潰,並可能得到更好的堆棧跟蹤。第三,從SCNPrimitiveSCNGeometryPrimitiveTypeLine這樣的基元創建自己的幾何圖形要比使用SCNGeometry子類更復雜。內存管理不當可能會引發神祕的崩潰。如果刪除這些連接線會發生什麼?如果將它們替換爲較長的瘦身SCNBox實例,會發生什麼情況?您最終可能會選擇使用SCNBox,因爲在SceneKit中的樣式比原始線更容易。

四,看看@ rickster對這個優化問題的回答:SceneKit on OS X with thousands of objects。這聽起來像你的項目將受益於節點扁平化(flattenedClone),並可能使用SCNLevelOfDetail。但是這些建議屬於過早優化的範疇,這是萬惡之源。

聽到Metal和OpenGL渲染器之間的切換結果會很有趣。這是IB中的SCNView(我認爲是「首選渲染器」)和Info.plist中的可選條目中的一個設置。

+0

感謝您的詳細回覆!好,那麼(1)_首先,你有沒有在屏幕上看到任何東西?_是的!該應用程序完美適用於較少數量的節點和邊緣。如果我做了5,000個10度(50,000個SCN節點),它可以正常工作。 (2)關於主隊列,將該調用移動到塊外的'addChildNode'似乎不會影響任何內容;我只是這樣做,因爲我總是被教導將影響用戶界面的東西放在主隊列中。我會根據您的建議將其刪除。 (3)_如果刪除這些連接線會發生什麼?_我可以處理更多的SCNNodes ... – Spencer

+0

[續]我沒有使用另一個SCNGeometry子類的原因是它似乎具有相同的效果,但它可以處理的門檻要低得多。我用了圓柱體,但是SceneKit無法處理那麼多的物體。確保圓柱體的位置和旋轉也很困難,但我保存了這些代碼,這樣我可以切換回來,如果這看起來更好。最後,我會確保查看該鏈接,聽起來像是一個很棒的資源。再次感謝您的幫助,請讓我知道我的回答是否有幫助! – Spencer

+1

這一切聽起來像是你正在達到極限,然後,並且你的實現代碼是正確的。我建議SCNBox/SCNCylinder只是爲了排除菜鳥的錯誤 - 所以要抓住這個想法。我認爲你最好的選擇是將圖形添加到場景中之前,將其展開爲「flattenedClone」。請務必在bugreport.apple.com上提交您的項目的性能報告。 –