0

Apple 的文档说我做的一切都是正确的,但是我遇到了一个严重的崩溃,Apple 的驱动程序在一个简单的 OpenGL ES 2 程序上内部 100% 可重现地崩溃。

在遵循 Apple 关于多线程访问的说明时,Apple 的驱动程序中似乎存在一个重大错误 wrt 多线程访问。或者......我在文档中遗漏了一些东西,即使我已经阅读过,多次重新阅读它们:(。

我会非常乐意使用 NSOperationsGCD (无论如何,它们在后台实现相同),但我无法工作。

这是我知道/尝试过的:

  1. 全部在主线程上=工作正常:
    1. 设置 GL,渲染单个三角形,加载纹理,加载几何体,渲染整个场景
  2. GCD =后台GCD“完成”后立即硬崩溃
    1. 在主线程上设置 GL,渲染单个三角形
    2. dispatch_async() 创建新的 EAGLContext,加载纹理,几何
    3. 在主线程上渲染
  3. NSOperationQueue =后台GCD“完成”后立即崩溃
    1. 在主线程上设置 GL,渲染单个三角形,创建新的 NSOperationQueue
    2. addOperationWithBlock:创建新的 EAGLContext,加载纹理,几何
    3. 在主线程上渲染

附加说明/Apple 指示我们做的事情:

  • 已检查:我通过共享 ShareGroup 属性将新的 EAGLContext 连接到旧的
  • 已检查:我在加载纹理 + 几何图形后立即明确尝试 glFlush() (两种方式都没有效果)
  • 检查:我尝试重新使用原始线程的 EAGLContext(坏主意!) - 不同的崩溃,这并不奇怪,因为 Apple 说这是未定义的并且会崩溃
4

2 回答 2

0

我不是 100% 确定您要做什么,但请考虑以下两件事:

  1. OpenGL ES 2 上下文不能同时存在于多个线程上。

    但是,如果您始终记得在空上下文和您的上下文之间切换每个线程,那么您可以在多个线程中使用单个上下文,这样您就不会同时在两个线程中设置您的上下文

  2. 这部分我不太确定。您可以拥有共享上下文,但共享上下文应仅用于为第一个上下文加载纹理,它也不应该用于渲染。

    不确定它在实践中是如何实施的,以及如果您使用共享上下文进行渲染会发生什么。

希望这对您有所帮助。

于 2015-07-03T03:56:38.333 回答
0

我可以告诉你,至少,你可以在带有共享组的 GLContext 的串行队列上加载纹理。在我的代码和 iPhone 代码的 cocos2d 中,完全没有问题。

你应该检查 cocos2d 代码。

https://github.com/cocos2d/cocos2d-objc/blob/v3.4/cocos2d/CCTextureCache.m

于 2015-07-03T04:47:38.197 回答