iOS 14解决方法中的SceneKit Metal着色器编译性能错误

问题描述

我正在寻找一个SceneKit专家,以提出某种方法解决SceneKit内置的iOS 14.x和macOS Catalyst 11.x中的Metal着色器编译中的不良性能错误。由于我已经尽力想尽一切办法让Apple解决问题(TSI,反馈,Twitter,开发人员论坛,Apple传播者),所以我们需要一种解决方法

使用带有SceneKit跟踪的Xcode Instruments应用程序,在iOS 14.0、14.1和14.2 Beta(包括Beta 4)中,SceneKit着色器的编译速度可能比iOS 13.7慢100倍。例如,在iOS 13.7中,通常需要SceneKit 1-2ms来编译着色器,而在iOS 14中,它最多可能需要200ms。

每当我们向可见场景中的父节点添加新的模型节点树时,SceneKit似乎都会自动编译着色器。

在我们的应用程序中加载典型的SceneKit场景,其中包含数十个模型节点,耗时从不到2秒到30秒以上。而且,由于SceneKit着色器编译发生在似乎由CAdisplayLink处理程序调用的渲染线程上,因此整个应用程序UI可以完全冻结很多秒(测试中超过30秒)。这极大地影响了我们基于SceneKit的应用程序的可用性。

如果您认为要获得60-30 fps场景更新之类的东西,则每帧花费不超过16-33毫秒以避免帧丢失,对于许多帧而言,每花费200毫秒是非常糟糕的。 (如果您想在iPad Pro上获得120 fps的速度...)

一个问题是错误,这是非常不一致的:我可以使用Instruments进行一次应用程序运行,并且编译时间会很好(1-2毫秒),而我会再进行几次运行,因此不利于每个着色器编译(100-200毫秒)。我认为正在进行一些Metal着色器缓存,但是我不知道它是如何工作的以及导致它失效的原因。

我尝试了数十种方法解决此问题:多个队列/线程/操作,事务,延迟节点添加以一次添加多个节点,使用执行(避免:致命的崩溃错误)等,我尝试了在所有其他节点之前或之后,在所有其他节点之后添加带有灯光的节点。

我们在所有模型中都使用了PBR材料,并且在大多数场景(例如,室外的太阳或月亮,室外的室内照明)中启用了带有阴影的多个灯光以及环境照明。虽然显然ARSceneView确实启用了反射,但在SCNView非AR模式下未启用反射。通常,我们不使用任何自己的着色器,尽管有些场景使用自定义着色器修改器,但在删除它们时似乎没有任何作用。

任何人和所有建议都将不胜感激。谢谢!

这是一个示例场景屏幕快照以及在基于iOS 14的iPad Pro 11(2018)上运行应用程序的Instruments 12.1的着色器编译时间:

enter image description here

00:01.347.989   667.58 µs   Compile shader  
00:01.349.275   579.62 µs   Compile shader  
00:01.350.529   779.17 µs   Compile shader  
00:01.353.772   809.92 µs   Compile shader  
00:01.358.928   909.54 µs   Compile shader  
00:01.361.232   831.96 µs   Compile shader  
00:01.363.443   779.17 µs   Compile shader  
00:01.371.931     1.09 ms   Compile shader  
00:02.336.543   786.88 µs   Compile shader  
00:02.338.079   594.67 µs   Compile shader  
00:02.344.969   805.38 µs   Compile shader  
00:02.349.393   845.71 µs   Compile shader  
00:02.351.679   775.33 µs   Compile shader  
00:02.353.969   714.75 µs   Compile shader  
00:02.355.389   578.96 µs   Compile shader  
00:02.374.813   243.54 ms   Compile shader  
00:02.619.090   204.87 ms   Compile shader  
00:02.824.654   203.34 ms   Compile shader  
00:03.033.721   203.22 ms   Compile shader  
00:03.245.523   199.92 ms   Compile shader  
00:03.446.541   641.67 µs   Compile shader  
00:03.458.231   200.25 ms   Compile shader  
00:03.670.527   202.03 ms   Compile shader  
00:03.875.402   200.12 ms   Compile shader  
00:04.089.184   725.21 µs   Compile shader  
00:04.091.070   201.98 ms   Compile shader  
00:04.297.075   212.00 ms   Compile shader  
00:04.509.799   200.11 ms   Compile shader  
00:04.710.886   203.88 ms   Compile shader  
00:04.915.507   199.86 ms   Compile shader  
00:05.116.368   199.27 ms   Compile shader  
00:05.316.424   200.51 ms   Compile shader  
00:05.517.957   203.45 ms   Compile shader  
00:05.722.065   646.38 µs   Compile shader  
00:05.723.205   582.29 µs   Compile shader  
00:05.802.072   831.96 µs   Compile shader  
00:05.808.265   203.29 ms   Compile shader  

解决方法

我在iOS 14中看到过类似的性能下降。 在App Clip中运行的基于SceneKit的ARKit项目甚至发生完全冻结。 您最近是否听说过任何改进或解决方法?