为什么Xcode 5.1 OpenGLES帧捕获导致应用程序崩溃?

时间:2014-04-05 13:50:06

标签: ios xcode debugging opengl-es

我试图在iOS 7上调试一些手写的OpenGLES 2.0代码。代码运行正常,因为它不会崩溃,内存不足或在模拟器上运行不正常一个真正的iPhone设备,但图形输出不是我所期待的。

我在Xcode 5.1中使用Capture OpenGLES框架功能尝试调试OGL调用,但我发现当我单击按钮捕获框架时,应用程序崩溃(在OpenGL渲染代码中 - glDrawArrays()确切地说,使用EXC_BAD_ACCESS,代码= 1.

重复一遍,代码运行正常,没有崩溃任意长,只有当我单击调试器中的按钮才能捕获崩溃发生的帧时。

有关我可能做错的事情的任何建议会导致这种情况发生吗?

1 个答案:

答案 0 :(得分:0)

我并不确切地知道你在做什么,但这是我正在做的事情导致正常(虽然不同于预期)渲染,并且仅在尝试捕获帧时崩溃:

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

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

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

  4. 每帧渲染一次精灵:没有绘制任何东西。尝试OpenGL帧捕获时,它会在EXC_BAD_ACCESS

  5. 时与glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);崩溃

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