gpus_ReturnGuiltyForHardwareRestart [EAGLContext presentRenderbuffer]中的崩溃

dan*_*zlo 18 iphone graphics opengl-es objective-c ios

EAGLContext presentRenderbuffer在iOS 11上遇到了很多崩溃,但仅限iPhone 6/6 +及更早版本.

根据这篇文章,我认为我们已经通过重写所有不使用VBO/VAO来排除与VBO相关的问题,但崩溃并没有解决.

还有一些关于此问题的其他问题,但没有解决方案 - 还有其他人看到过这次崩溃的上升并且能够解决它吗?


TL; DR:

这是我们目前所知道的:

  • 崩溃特定于iOS11,iPhone 5S/6/6 +.它不会发生在6S及以上.
  • OpenGL堆栈的核心返回gpus_ReturnGuiltyForHardwareRestart
  • 当我们尝试从CAEAGLLayer调用[EAGLContext presentRenderbuffer]时会发生这种情况
  • 我们没有复制品.

到目前为止我们尝试了什么:

  • 删除渲染堆栈中对VBO/VAO的任何引用.没有帮助.
  • 我们尝试过使用各种绘图场景(​​旋转,调整大小,背景/前景)进行重新编辑.没运气.
  • 据我们所知,iPhone 6系列和iPhone 6S系列之间的应用逻辑没有任何具体内容.

一些线索(可能相关但不一定):

  • 我们知道,当主线程调用presentRenderBuffer,并且主线程上同时发生了一些CATransaction时,崩溃率会上升.
  • 当在主线程(以及整个绘图管道)上调用presentRenderBuffer时,崩溃率会略微下降但不会大幅下降.
  • 当图层离开屏幕和/或离开视图层次结构时,会发生大量的崩溃(约20%)崩溃.

这是堆栈跟踪:

  libGPUSupportMercury.dylib gpus_ReturnGuiltyForHardwareRestart

1 AGXGLDriver gldUpdateDispatch
2 libGPUSupportMercury.dylib gpusSubmitDataBuffers
3 AGXGLDriver gldUpdateDispatch
4 GLEngine gliPresentViewES_Exec
5 OpenGLES -[EAGLContext presentRenderbuffer:]
Run Code Online (Sandbox Code Playgroud)

小智 2

根据我的经验,我在这些情况下会遇到这种崩溃:

  1. 当应用程序处于状态时调用 OpenGL API UIApplicationStateBackground
  2. 使用在 OpenGL 上下文中创建的具有不同 shareGroup 的对象(纹理、VBO 等)。如果您在渲染或使用 OpenGL 对象进行其他工作之前未调用 [EAGLContext setCurrentContext:..],则可能会发生这种情况。
  3. 几何图形无效。例如,如果您为所需的更大大小分配索引缓冲区,则可能会发生这种情况。用一些值填充它,然后尝试使用分配时使用的大小进行渲染。有时这会起作用(缓冲区尾部填充 0,并且您看不到任何视觉故障)。有时它会崩溃(当缓冲区尾部充满垃圾,并且引用超出范围的点时)。

希望这能在某种程度上有所帮助。

PS也许你能告诉一些有关你的应用程序的更多信息?我编写了在 iOS 上渲染矢量地图的应用程序,目前 iOS 11 不会遇到任何问题。渲染管道非常简单,CADisplayLink当我们可以渲染下一帧时,在主线程上调用回调。每个具有 OpenGL 场景的视图都可以有多个后台上下文来在后台加载资源(ofc 它与主上下文具有相同的 shareGroup)。