【问题标题】:iOS 7 and Cocos2d, exc_bad_access on glDrawElements completely randomiOS 7 和 Cocos2d,glDrawElements 上的 exc_bad_access 完全随机
【发布时间】:2013-10-07 23:29:11
【问题描述】:

我开发了一款游戏,并且在之前的 iOS 版本中对其进行了测试,玩了数百次,在我安装了 iOS7 并更新了 xcode 之后,我什至没有看到一次崩溃刚刚尝试了我的应用程序......现在有时它会崩溃。崩溃不是在特定的时刻或动作中发生的,它们只是完全随机的,有时它会立即崩溃,有时在 2-3 场比赛之后,我试图做同样的事情来检查它是否是特别的,但似乎不是,或者至少不是以这种方式引人注目的东西。我在游戏场景中使用精灵和批处理节点。

正好在 CCTextureAtlas.m 文件中的这行代码(大约 522 行):

glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, (GLvoid*) (start*6*sizeof(_indices[0])) );

由于我没有对代码进行任何更改,我非常怀疑这可能是我所做的事情,可能与影响 cocos2d 的 iOS7 中的更改有关?我什至不是 opengl 专家,所以我很难理解发生了什么......

显然在游戏中我正在进行一些动画...

附加信息:

  • 在内存警告后不会发生这种情况(我根本没有内存警告)。

【问题讨论】:

  • 确保在调用 glDrawElements() 之前,没有任何东西导致另一个线程/队列上的 opengl 调用可能破坏 VBO 的状态(glDrawElements 试图绘制的内容)。
  • 这也发生在我身上......但仅限于模拟器中(请注意,“没有看到”某些东西很难证明)。在模拟器中运行时,出现异常后,我可以从那里恢复!!!
  • 我发现在我的情况下,问题是由 CCLabelBMFont 引起的,可能在 iOS7 之后发生了一些事情,并且在绘制它们时有可能发生崩溃。实际上我已经用 CCLabelTTF 替换了它们,现在一切都很好,但是因为我还不知道如何修复它(这只是一种解决方法)我没有发布答案......我发现可能是那些要进行的更改,但我还没有尝试过:github.com/jllust/cocos2d-x/commit/…
  • @Loudequal 解决了我的类似问题。好收获!

标签: opengl-es cocos2d-iphone ios7


【解决方案1】:

在每次调用 glDeleteVertexArrays(1, &_VAOname); 后添加 ccGLBindVAO(0);,停止崩溃。

此调用包含三个文件:

 CCDrawNode:164
 CCTextureAtlas:142
 CCParticleSystemQuad:164
 CCParticleSystemQuad:229
 CCParticleSystemQuad:492

CCTextureAtlas 中也是这样:

#if CC_TEXTURE_ATLAS_USE_VAO
    glDeleteVertexArrays(1, &_VAOname);
    ccGLBindVAO(0);
#endif

我使用的是 cocos2d-iphone classic 2.2。

代码在这里:https://github.com/jllust/cocos2d-x/commit/1f3c1145362c921bf5232c4ffbca4a5245042bae

我提出了一个 cocos2d-iphone-classic 拉取请求:https://github.com/zeraien/cocos2d-iphone-classic/commit/817a9c14a3aa1d4c162071521e45e2fcce473d77

【讨论】:

  • 非常非常非常非常感谢......我有一个旧项目但无法解决。你是我的上帝。
  • 很高兴它有帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
相关资源
最近更新 更多