1

我正在尝试将大约 4.5kSCNNode对象添加到场景中。它们的几何形状是两个SCNPlanes 之一,其材质由CALayers 渲染(但我认为这并不重要,每个CALayerDelegates 只调用一次,所以这似乎不是问题。)性能很糟糕(< 1fps .)

.showsStatistics启用后,我看到我正在执行近 3.5k 绘制调用,根据 2017 年的 WWDC 视频,这是我的问题。因此,按照建议,我将所有节点添加到一个父节点并.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!

这是怎么回事?为什么调用.flattenedClone()具有大约 2.5k 个节点的节点不会……使其变平?

4

1 回答 1

0

问题确实CALayers,但它很微妙:如果我改为将其渲染CALayer为 a UIImage(实际上我把它全部作为 a UIGraphicsBeginImageContextWithOptions(...),不需要显式的CALayer),.flattenedClone()确实做了我期望它做的事情,我得到了任何数量的单元格都接近 60fps。如果我CALayer直接将其附加到材料上,则节点不会变平。

也许这与 aCALayer是可动画的事实有关?无论如何,使用静态UIImage它可以工作。这个问题通过提到一些展平是自动的情况,以及即使你调用它也根本不会发生的一些情况,给了我提示。

于 2019-09-02T13:39:48.403 回答