【问题标题】:Why does SCNNode .flattenedClone() either crash or make performance worse?为什么 SCNNode .flattenedClone() 会崩溃或使性能变差?
【发布时间】:2020-01-01 17:18:31
【问题描述】:

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

启用.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() 不会……将其展平?

【问题讨论】:

    标签: performance scenekit scnnode scngeometry


    【解决方案1】:

    问题确实原来是CALayers,但它很微妙:如果我将CALayer改为UIImage(实际上我将这一切都作为@987654325 @,不需要明确的CALayer),.flattenedClone() 确实做到了我期望它做的事情,并且我在任意数量的单元格下都接近 60fps。如果我将CALayer 直接附加到材质上,节点不会变平。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2013-01-31
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多