Performance 为什么SCNNode.flattedClone()会崩溃或使性能恶化?

Performance 为什么SCNNode.flattedClone()会崩溃或使性能恶化?,performance,scenekit,scnnode,scngeometry,Performance,Scenekit,Scnnode,Scngeometry,我试图将大约4.5kSCNNode对象添加到场景中。它们的几何图形是两个SCNPlanes中的一个,其材质由CALayers渲染(但我认为这并不重要,每个CALayerDelegates只调用一次,所以这似乎不是问题。)性能非常糟糕(8192中的x每行上升一个) 如果在将结果添加到根节点之前,我将节点分成两组并对其调用.flattedClone(),则错误会消失,但我的draw调用计数会增加到近5k 发生什么事了?为什么在大约有2.5k个节点的节点上调用.flattedClone()。。。展平它

我试图将大约4.5k
SCNNode
对象添加到场景中。它们的几何图形是两个
SCNPlane
s中的一个,其材质由
CALayer
s渲染(但我认为这并不重要,每个
CALayerDelegate
s只调用一次,所以这似乎不是问题。)性能非常糟糕(<1fps)

启用
.showsStatistics
后,我看到我正在进行近3.5k次抽签调用,这是我的问题。因此,正如建议的那样,我将所有节点添加到一个父节点,并在将其添加到场景的根节点之前对其调用
.flattedClone()
。这导致我的控制台出现图形损坏和重复错误:

2019-08-28 14:50:39.122937+0200 Breadboard[867:53252] [SceneKit] Error: C3DProgramHashCodeStoreRegisterProgramForRendererElement - index out of capacity (8192 > 8192)
(x>8192中的x每行上升一个)

如果在将结果添加到根节点之前,我将节点分成两组并对其调用
.flattedClone()
,则错误会消失,但我的draw调用计数会增加到近5k

发生什么事了?为什么在大约有2.5k个节点的节点上调用
.flattedClone()
。。。展平它?

问题确实出在
CALayer
上,但它很微妙:如果我将
CALayer
渲染成
UIImage
(实际上我都是作为
UIGraphicsBeginImageContextWithOptions(…)
,就不需要显式的
CALayer
.flattedclone()
确实做到了我预期的效果,而且我可以用任意数量的单元格获得接近60fps的速度。如果将
CALayer
直接附加到材质,则节点不会展平

也许这与
CALayer
是可动画的这一事实有关?在任何情况下,使用静态
UIImage
都可以工作。给了我一个提示,提到了一些情况下展平是自动的,有些情况下即使你调用它也不会发生。

问题确实是
CALayer
s,但它很微妙:如果我将
CALayer
渲染成
UIImage
(实际上,我是以
UIGraphicsBeginImageContextWithOptions(…)
的形式完成的,不需要显式的
CALayer
),
.flattedclone()
确实做到了我期望的效果,并且我可以用任意数量的单元格获得接近60fps的速度。如果我将
CALayer
直接连接到材质,节点不会变平

也许这与
CALayer
是可动画的这一事实有关?在任何情况下,使用静态
UIImage
都可以工作。通过提到一些情况给了我一些提示,其中展平是自动的,有些情况下即使调用它也不会发生