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

Why does SCNNode .flattenedClone() either crash or make performance worse?

我正在尝试将大约 4.5k SCNNode 个对象添加到场景中。它们的几何形状是两个 SCNPlanes 之一,其材质由 CALayers 渲染(但我认为这不重要,每个 CALayerDelegates 只调用一次,所以不会'似乎是个问题。)性能很糟糕(< 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() 不会...将其展平?

问题 did 结果是 CALayers,但它很微妙:如果我将 CALayer 渲染成 UIImage(实际上我做这一切都是作为 UIGraphicsBeginImageContextWithOptions(...),不需要明确的 CALayer),.flattenedClone() 确实做了我期望的事情,我接近 60fps 任何细胞数。如果我将 CALayer 直接附加到 material,节点不会变平。

也许这与 CALayer 是可动画的事实有关?在任何情况下,使用 static UIImage 它都有效。 This question 通过提及一些自动展平的情况以及一些即使您调用它也根本不会发生的情况给了我提示。