【问题标题】:Game running fine on iOS 4.3, but crashing on iOS 5 on glDrawArrays游戏在 iOS 4.3 上运行良好,但在 iOS 5 上 glDrawArrays 上崩溃
【发布时间】:2012-09-19 03:14:38
【问题描述】:

一年前我开发了一款 iPhone 游戏,并决定从我离开的地方继续。 因此,我下载了在 Mac OS X 10.7.4 上运行的最新版本的 Xcode (4.4.1),并使用 iOS 5.1 SDK(为 iOS 4.0 构建)构建了我的游戏,并在 iOS 5.1 的模拟器中运行它。 .. 它在第一次 glDrawArrays() 调用时崩溃。

所以我觉得这很奇怪,因为当我上次处理它时,它确实运行得非常好。然后我尝试在 iOS 4.3 上运行,它运行良好! 原来它从iOS崩溃。 5.0 及以上。我也尝试构建更高的目标操作系统版本,但这没有任何区别。

应用程序在 glDrawArrays 执行的 gleRunVertexSubmitImmediate 调用(带有 EXC_BAD_ACCESS 消息,地址 0x0)时崩溃。在第一次 glDrawArrays 调用时它总是出错,因为如果我评论第一个,它运行良好(黑屏),直到我启动应该是第二次 glDrawArrays 调用并且它再次崩溃。

对加载的数组(纹理指针、顶点、gl 上下文)进行了一些检查,但我无法发现任何空引用。 在启用僵尸的情况下运行不会为我提供更多信息。

我想知道是否有人遇到过同样的问题或知道是什么原因造成的。

编辑:代码示例是请求。它发生在 Apple 发布的 GLTexture.m (v1.7) 中,因为这是代码中调用 glDrawArrays 的第一个点。

- (void) drawInRect:(CGRect)rect
{
    CLogGL();
    GLfloat  coordinates[] = {  0,      _maxT,
                                _maxS,  _maxT,
                                0,      0,
                                _maxS,  0  };
    GLfloat vertices[] = {  rect.origin.x,                          rect.origin.y,                          0.0,
                            rect.origin.x + rect.size.width,        rect.origin.y,                          0.0,
                            rect.origin.x,                          rect.origin.y + rect.size.height,       0.0,
                            rect.origin.x + rect.size.width,        rect.origin.y + rect.size.height,       0.0 };

    glBindTexture(GL_TEXTURE_2D, _name);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  // Crash happens here
}

编辑:堆栈跟踪的屏幕截图: stacktrace1.jpg stacktrace2.jpg stacktrace3.jpg

编辑:似乎它在 4.2.2 上也崩溃了(在我的 iPod touch 上),但在 4.3 模拟器中仍然运行良好。

【问题讨论】:

  • 这个渲染代码是否都在同一个线程上运行,或者您是否有可能从多个线程访问 OpenGL ES 上下文?您可能遇到了旧 iOS 版本中避免的竞争条件。
  • 在一个线程中运行。我添加了一些来自 Xcode 的屏幕截图,显示了堆栈跟踪

标签: ios opengl-es exc-bad-access


【解决方案1】:

也许您的 normal_array 或 color_array 在某处启用。尝试禁用它们:

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);

如果启用但未设置 glDrawArrays 将崩溃

【讨论】:

  • 是的......当我在 1.5 年前最后一次参与该项目时,我在创建我的 glesContext 时添加了 glEnableClientState(GL_COLOR_ARRAY)。我忘记了这一点,iOS 4.3 似乎没有问题......但如果你实际上不给 GLES 提供颜色数组,它会导致内存问题是有道理的 :) 现在删除了 GL_COLOR_ARRAY 状态启用并且游戏运行没有问题!谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
相关资源
最近更新 更多