【问题标题】:Why does Xcode 5.1 OpenGLES frame capture cause app to crash?为什么 Xcode 5.1 OpenGLES 帧捕获会导致应用程序崩溃?
【发布时间】:2014-05-09 21:39:14
【问题描述】:

我正在尝试在 iOS 7 上调试一些手写的 OpenGLES 2.0 代码。代码运行良好,只要它不会崩溃、内存不足或在模拟器和实际 iPhone 设备上运行不正常但图形输出不是我所期望的。

我正在使用 Xcode 5.1 中的捕获 OpenGLES 帧功能来尝试调试 OGL 调用,但我发现当我单击按钮捕获帧时,应用程序崩溃(在 OpenGL 渲染代码中 - 确切地说是 glDrawArrays() ) 带有 EXC_BAD_ACCESS,代码 = 1。

重复一遍,代码将运行良好,并且在任意长时间内都不会发生崩溃,并且只有当我单击调试器中的按钮以捕获发生崩溃的帧时。

关于我可能做错了什么会导致这种情况发生的任何建议?

【问题讨论】:

  • 这里相同,但前提是我加载带有背景上下文的纹理。

标签: ios xcode debugging opengl-es


【解决方案1】:

我不确切知道您在做什么,但这是我所做的导致正常(尽管与预期不同)渲染,并且仅在尝试捕获帧时崩溃:

  1. 通过使用后台 EAGLContext(与主上下文相同的共享组)在后台线程中异步加载纹理(自己的代码,不是 GLKit,但类似的方法)。将 C 块作为“完成处理程序”传递,将创建的纹理作为唯一参数,在创建时将其传递回客户端。

  2. 完成后,调用块(注意这是来自纹理加载方法,所以我们仍然在后台线程/gl上下文中运行。)

  3. 从完成块中,使用所述纹理创建一个精灵。精灵创建涉及使用顶点/纹理坐标、着色器属性位置等生成顶点数组对象。所述代码不直接调用 openGL ES 函数,而是使用一组在客户端(应用程序)上缓存 OpenGL ES 状态的包装函数侧,并且仅在所涉及的值发生变化时才调用实际函数。因为 gl 状态是在客户端缓存的,所以每个 gl 上下文都需要一个单独的数据结构,并且缓存函数必须始终知道它们正在处理哪个上下文。 VAO 生成代码不知道正在后台上下文中运行,因此缓存可能已损坏/不同步。

  4. 每帧渲染所述精灵:没有绘制任何内容。尝试 OpenGL 帧捕获时,它在 EXC_BAD_ACCESS 处崩溃:glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);

我真的不需要在后台线程上创建几何体,所以我所做的是强制调用主线程上的完成块(参见this question),这样一旦纹理准备好,所有的精灵都会被创建使用主 gl 上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2020-05-26
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多