【问题标题】:OpenGL ES 2.0 multithreadingOpenGL ES 2.0 多线程
【发布时间】:2009-11-25 09:51:48
【问题描述】:

我一直在尝试使用 OpenGL ES 2.0 来制作照片查看应用程序。为了优化代码,我在用户向下滚动时更改了与对象一起加载的纹理。但是图像加载到纹理中需要一些时间,因此效果不好。为了解决上述问题,我尝试通过以下方式使用多线程:

  1. 为新线程创建一个单独的上下文,然后与其他上下文共享资源(纹理对象)
  2. 使用多个线程和单个上下文。在线程中执行 gl 命令时使上下文处于当前状态。

但没有成功。所以如果有人之前用opengl尝试过类似的事情,你能告诉我上面哪些会起作用以及我在做同样的事情时需要注意的事情吗?在这种情况下,FBO 和 pbuffers 也有用吗?

感谢您的帮助。

喜满洲

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    我建议将 OpenGL 内容保留在主线程中,并将数据加载委托给工作线程。

    例如,有一个图像数据对象的循环缓冲区,您的工作线程可以让自己忙于填充,但让您的主线程根据需要从图像数据生成纹理。

    【讨论】:

      【解决方案2】:

      我不认为方法 1 是有效的 - 你不应该跨上下文共享资源。

      像您的方法 2 这样的方法我非常成功。我的应用程序 iSynth 在处理网络请求并尝试每秒渲染相当数量的帧的同时进行大量纹理创建。我为 OpenGL 使用了两个线程,它们共享一个上下文。

      其中之一是专用的渲染线程。在高层次上,这是一个 while 循环,它使用当时可用的任何纹理重复调用我的渲染代码。

      另一个只为渲染线程创建纹理资源以供使用。图像在主线程上不断下载并排队 - 这个线程在生活中的唯一任务是通过该队列并输出 GL 纹理。

      这种方法效果很好,因为一个线程严格来说是生产者,而另一个线程是消费者。如果您开始尝试在渲染线程上创建纹理,或者在纹理线程上修改 GL 状态,我可以预见到很多丑陋的问题。如果您遇到问题,我会确保您正确设置共享上下文并使该上下文在每个线程上都是最新的。此外,如果使用该上下文的线程消失,我发现有必要首先从该线程调用 setCurrentContext: nil。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 2012-12-20
        • 2013-01-08
        相关资源
        最近更新 更多