我正在尝试向场景中添加约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()
并不能使其扁平化?
答案 0 :(得分:0)
问题 did 原来是CALayer
,但这很微妙:如果我改为将CALayer
渲染为UIImage
(实际上,我确实所有这些都是UIGraphicsBeginImageContextWithOptions(...)
,不需要明确的CALayer
),.flattenedClone()
确实可以完成我期望的操作,并且在任意数量的像元下我的速度接近60fps。如果我将CALayer
直接附加到材质,则节点不会展平。
也许CALayer
是可以动画的事实吗?无论如何,使用静态UIImage
都可以。 This question通过提及一些自动平展的情况为我提供了提示,甚至在您调用平整化的情况下也完全没有发生这种情况。