问题描述
我正在寻找一个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的着色器编译时间:
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项目甚至发生完全冻结。 您最近是否听说过任何改进或解决方法?