为什么SCNNode .flattenedClone()崩溃或使性能变差?

时间:2019-08-28 13:01:38

标签: performance scenekit scnnode scngeometry

我正在尝试向场景中添加约4.5k SCNNode个对象。它们的几何形状是两个SCNPlane之一,其材质是由CALayer渲染的(但是我认为这并不重要,CALayerDelegate只能被调用一次,因此似乎不是问题。)性能太差了(<1fps。)

启用.showsStatistics后,我看到我正在进行近3.5k的绘制调用,这是this WWDC video from 2017的问题。因此,按照建议,我将所有节点添加到一个父节点,并在其上调用.flattenedClone(),然后再将其添加到场景的根节点。这使我的图形损坏并在控制台上重复出现错误:

2019-08-28 14:50:39.122937+0200 Breadboard[867:53252] [SceneKit] Error: C3DProgramHashCodeStoreRegisterProgramForRendererElement - index out of capacity (8192 > 8192)

(“ x> 8192”中的x每行增加一个)

如果我将节点分为两组并在将结果添加到根节点之前调用.flattenedClone(),错误消失了,但是我的绘图调用计数上升了到近5k!

这是怎么回事?为什么在具有约2.5k个节点的节点上调用.flattenedClone()并不能使其扁平化?

1 个答案:

答案 0 :(得分:0)

问题 did 原来是CALayer,但这很微妙:如果我改为将CALayer渲染为UIImage(实际上,我确实所有这些都是UIGraphicsBeginImageContextWithOptions(...),不需要明确的CALayer),.flattenedClone()确实可以完成我期望的操作,并且在任意数量的像元下我的速度接近60fps。如果我将CALayer直接附加到材质,则节点不会展平。

也许CALayer是可以动画的事实吗?无论如何,使用静态UIImage都可以。 This question通过提及一些自动平展的情况为我提供了提示,甚至在您调用平整化的情况下也完全没有发生这种情况。