gpus_ReturnGuiltyForHardwareRestart [EAGLContext presentRenderbuffer]中的崩溃

时间:2017-10-05 22:45:17

标签: ios objective-c iphone graphics opengl-es

我在iOS 11上EAGLContext presentRenderbuffer遇到了很多崩溃,但仅限iPhone 6/6 +和旧版

根据this post,我认为我们已经通过重写所有不使用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:]

1 个答案:

答案 0 :(得分:1)

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

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

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