【问题标题】:How to make OpenGL ES 2 run multi-threaded using GCD / NSOperationQueue on iOS如何在 iOS 上使用 GCD / NSOperationQueue 使 OpenGL ES 2 运行多线程
【发布时间】:2013-11-01 01:02:28
【问题描述】:

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

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

我非常乐意使用 NSOperations GCD(无论如何,它们的实现方式都是一样的),但我都无法工作。

这是我知道/尝试过的:

  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 说这是未定义的并且会崩溃

【问题讨论】:

  • 如果您有可重现的错误,请通过 Apple 将其记录在:bugreporter.apple.com
  • 我用 Apple 记录的最后一个 OpenGL 错误被接受了 - 然后我得到了一位 Apple 工程师的抱怨,他同意它被破坏但不想修复它。对我没有帮助:(。另外:让我对提交更多错误(并受到更多滥用)非常不感兴趣
  • 很抱歉听到这个消息;听起来最不专业。但无论如何请记录下来,最终会有一个更称职的工程师出现(可能已经这样做了)并且它会被修复。

标签: ios opengl-es grand-central-dispatch


【解决方案1】:

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

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

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

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

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

希望对你有所帮助。

【讨论】:

    【解决方案2】:

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

    你应该检查 cocos2d 代码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      相关资源
      最近更新 更多