iOS12在执行金属命令缓冲区时发生错误,渲染出现故障或未发生

时间:2018-09-22 20:35:45

标签: ios swift gpu scenekit metal

我们有一个使用Metal进行渲染的应用。这个应用程式可在执行iOS11的装置上正常运作。在运行iOS12的设备上使用同一应用程序时,我们开始出现故障,有时会挂在渲染中。我们还尝试了针对iOS12的重新编译,并且得到了同样的不良行为。在控制台上,我们收到以下不同消息:

  

2018-09-22 09:22:29.508576-0500 OurApp [1286:84481]由于执行期间发生错误,命令缓冲区的执行被中止。丢弃(GPU错误/恢复的受害者)(IOAF代码5)

     

2018-09-22 09:29:55.654426-0500 OurApp [1286:84625]由于执行期间发生错误,命令缓冲区的执行被中止。导致GPU挂起错误(IOAF代码3)

     

2018-09-22 09:34:37.718054-0500 OurApp [1286:87354]由于执行期间发生错误,命令缓冲区的执行被中止。被忽略(导致先前/过多的GPU错误)(IOAF代码4)

在出现前两个消息时,渲染似乎出现故障,出现空白屏幕,然后最终在屏幕上进行渲染。对于最后一条消息,实际上不会进行渲染,并且消息会继续显示,直到我们移至其他视图为止。

此应用使用SceneKit,实例化SCNView并使用默认的CIContext。它还使用基于物理的照明模型,该模型强制使用Metal渲染器。该应用程序具有简单的SCNNode几何形状,即圆柱体。圆柱体的每个几何对象都有一个正常的纹理(总共3个)。相同的漫反射,金属度和粗糙度值将应用于圆柱体的所有几何对象。

有人遇到过这个问题吗?如果是这样,您是如何解决的?

谢谢

更新:问题似乎是在将图像用作场景的照明环境时引起的:

let scene = SCNScene()
scene.lightingEnvironment.contents = UIImage(named: "ourLightingEnvironmentImage")

当不使用照明环境时,问题就消失了。这开始看起来像是苹果的bug,我们将提交一个。我们之所以陷入困境,是因为我们需要光照环境才能为应用程序中的模型生成逼真的反射。

4 个答案:

答案 0 :(得分:1)

我刚刚收到了我向Apple提交的错误的更新:

  

Apple开发人员关系

     

我们认为此问题已在最新的iOS 12.2 beta中得到解决。请测试最新的iOS Beta。如果仍有问题,请使用任何相关日志或信息来更新错误报告,以帮助我们进行调查。 iOS测试版https://developer.apple.com/download/

答案 1 :(得分:0)

通过选择OpenGL ES作为渲染模式,我目前能够解决我的问题:

enter image description here

答案 2 :(得分:0)

我似乎遇到了完全相同的问题。同样使用ARKit和默认的sceneKit编辑器,当屏幕冻结时,我一直不断收到IOAF代码4错误。

我通过将环境从“ Procedural Sky”更改为“ None”来解决了我的问题。不再滞后或冻结,但这几乎不是解决方案,因为我的AR对象现在没有光照或环境。我相信iOS 12.2 Beta中有一个修复程序,但尚未更新。

希望我的解决方案可以帮助其他人。

答案 3 :(得分:0)

这是由高分辨率的环境闪电图像引起的错误。

解决方案是调整这些图像的大小,我们现在正在使用1000x500。完美运行。