更新:对于偶然发现这一点的人来说,SceneKit似乎有一个可以渲染的最大对象数的阈值。使用[SCNNode flattenedClone]
是一种很好的方法,可以帮助增加它可以处理的对象数量。正如@Hal建议的那样,我将向Apple提交一份错误报告,描述下面讨论的性能问题。
我对iOS有点新鲜,我目前正在为一个班级开发我的第一个OS X项目。我基本上创建了随机几何图形(如果它们之间的距离≤给定半径,则在空间中的随机点相互连接)并且我使用SceneKit来显示结果。我已经知道我已经将SceneKit推到了极限,但是如果我试图绘制的对象数量太大,整个事情就会崩溃而且我不知道如何解释结果
我的SceneKit场景包含默认摄像头,2个照明节点,SCNSphere
(图表中的节点)各约5,000 SCNNode
个,然后是大约50,0000个连接键入SCNPrimitiveSCNGeometryPrimitiveTypeLine
,它们也在SCNNode
s内。然后将所有这些节点添加到一个大节点,该节点将添加到我的场景中。
该代码适用于较少数量的球体和连接。
当我使用这些规格运行我的应用程序时,一切似乎都正常,然后执行以下行后5-10秒:
dispatch_async(dispatch_get_main_queue(), ^{
[self.graphSceneView.scene.rootNode addChildNode:graphNodes];
});
鉴于我对Xcode有点新意,并且在崩溃时习惯了更详细的输出,我有点过头了。我该怎么做才能获得有关此次崩溃的更多信息?
答案 0 :(得分: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中的可选条目。