我正在尝试添加大约 4.5kSCNNode
对象到场景。它们的几何形状是以下两种之一SCNPlane
s,其材质由CALayer
s(但我认为这并不重要,CALayerDelegate
每个仅调用一次,因此这似乎不是问题。)性能很糟糕(
With .showsStatistics
启用我看到我正在执行近 3.5k 次绘制调用,这是我的问题这段 2017 年 WWDC 视频 https://developer.apple.com/videos/play/wwdc2017-605/?time=1187。因此,按照建议,我将所有节点添加到一个父节点并调用.flattenedClone()
在将其添加到场景的根节点之前。这导致我的图形损坏并在控制台上重复出现错误:
2019-08-28 14:50:39.122937+0200 Breadboard[867:53252] [SceneKit] Error: C3DProgramHashCodeStoreRegisterProgramForRendererElement - index out of capacity (8192 > 8192)
(“x > 8192”中的 x 每行增加 1)
如果我将节点分成两组并调用.flattenedClone()
在将结果添加到根节点之前,错误消失了,但我的绘制调用计数goes up到近5k!
这是怎么回事?为什么调用.flattenedClone()
在具有大约 2.5k 个节点的节点上,不...将其展平吗?
问题did结果是CALayer
s,但它很微妙:如果我改为渲染CALayer
into a UIImage
(实际上我做这一切都是为了UIGraphicsBeginImageContextWithOptions(...)
,不需要明确CALayer
), .flattenedClone()
确实达到了我的预期,无论单元数量如何,我都能达到接近 60fps 的速度。如果我附上CALayer
直接连接到材料上,节点不会变平。
也许这与以下事实有关CALayer
是可动画的吗?无论如何,用静态UIImage
有用。这个问题 https://stackoverflow.com/questions/50898979/scnnode-flattenedclone-does-not-reduce-draw-calls通过提到某些情况下扁平化是自动的,而有些情况下即使您调用它也根本不会发生,这给了我提示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)