我在 iOS 11 上的 EAGLContext presentRenderbuffer
中遇到了很多崩溃,但仅限于 iPhone 6/6+ 和 旧。
根据 this post ,我认为我们已经通过重写所有内容以不使用 VBO/VAO 来排除与 VBO 相关的问题,但崩溃并没有因此得到修复。
SO 上还有一些关于此的其他问题,但没有解决方案 - 是否有其他人看到这次崩溃的上升趋势并能够解决它?
长话短说:
这是我们目前所知道的:
- 崩溃特定于 iOS11、iPhone 5S/6/6+。它不会出现在 6S 及更高版本上。
- OpenGL 堆栈的核心返回 gpus_ReturnGuiltyForHardwareRestart
- 当我们尝试从 CAEAGLLayer 调用 [EAGLContext presentRenderbuffer] 时发生
- 我们没有复制品。
到目前为止我们尝试了什么:
- 在我们的渲染堆栈中删除对 VBO/VAO 的任何引用。没有帮助。
- 我们已尝试使用多种绘图场景(旋转、调整大小、背景/前景)进行重新制作。运气不好。
- 据我们所知,我们的应用程序逻辑在 iPhone 6 系列和 iPhone 6S 系列之间没有任何特定之处。
一些线索(可能相关但不一定相关):
- 我们知道,当 presentRenderBuffer 在主线程外被调用时,一些 CATransaction 同时在主线程上发生,崩溃率会上升。
- 在主线程(以及整个绘图管道)上调用 presentRenderBuffer 时,崩溃率会略有下降,但不会急剧下降。
- 大部分 (~20%) 的崩溃发生在图层离开屏幕和/或离开 View 层次结构时。
这是堆栈跟踪:
libGPUSupportMercury.dylib gpus_ReturnGuiltyForHardwareRestart
1 AGXGLDriver gldUpdateDispatch
2 libGPUSupportMercury.dylib gpusSubmitDataBuffers
3 AGXGLDriver gldUpdateDispatch
4 GLEngine gliPresentViewES_Exec
5 OpenGLES -[EAGLContext presentRenderbuffer:]
最佳答案
根据我的经验,在这些情况下我会遇到这种崩溃:
- 当应用程序处于
UIApplicationStateBackground
状态时调用 OpenGL API。 - 使用在具有不同 shareGroup 的 OpenGL 上下文中创建的对象(纹理、VBO 等)。如果您在渲染或使用 OpenGL 对象进行其他工作之前不调用 [EAGLContext setCurrentContext:..],就会发生这种情况。
- 无效的几何图形。例如,如果您为所需的更大尺寸分配索引缓冲区,就会发生这种情况。用一些值填充它,然后尝试使用分配时使用的大小进行渲染。有时这行得通(缓冲区的尾部填充了 0,并且您看不到任何视觉故障)。有时它会崩溃(当缓冲区的尾部充满垃圾,并且引用超出范围的点)。
希望这在某种程度上有所帮助。
附言也许你告诉一些关于你的应用程序的更多信息?我编写了在 iOS 上渲染矢量图的应用程序,目前在 iOS 11 上没有遇到任何问题。渲染管道非常简单 CADisplayLink
当我们可以渲染下一帧时在主线程上调用我们的回调。每个具有 OpenGL 场景的 View 都可以有多个背景上下文来在后台加载资源(当然它与主上下文具有相同的 shareGroup)。
关于ios - [EAGLContext presentRenderbuffer] 中的 gpus_ReturnGuiltyForHardwareRestart 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46595874/