SceneKit崩溃,没有详细的崩溃信息

时间:2015-12-13 22:38:52

标签: objective-c macos scenekit

更新:对于偶然发现这一点的人来说,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]; });

应用程序因此生成的屏幕崩溃:this resulting screen

鉴于我对Xcode有点新意,并且在崩溃时习惯了更详细的输出,我有点过头了。我该怎么做才能获得有关此次崩溃的更多信息?

1 个答案:

答案 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中的可选条目。