iOS上的OpenGL ES渲染线程

时间:2017-07-24 08:40:31

标签: ios opengl-es

我正在尝试多线程化我的iOS应用程序,以使其更具响应性。我想要一个线程来处理所有OpenGL的东西,比如渲染和加载缓冲区对象和纹理等。但是我很难实现这个。

我知道一个线程应该拥有它自己的上下文,以便调用gl函数而不会冒未定义行为的风险。所以在我的应用程序中,我在OpenGL专用线程中创建一个新的上下文,然后将其设置为当前上下文。然后我在该线程上进行所有加载和渲染。

我对此感到困惑的是GLKView上下文。我该怎么做呢?我是否将其设置为我在新线程中创建的上下文?或者我是否需要在主线程上创建另一个上下文并将其分配给它?然后让这两个上下文共享一个共享组?

1 个答案:

答案 0 :(得分:0)

这应该有效:

  1. 使用init(api:)创建背景上下文,或使用init(api:shareGroup:)并将nil传递给第二个参数。
  2. 获取刚刚创建的背景上下文的shareGroup
  3. 创建一个新的上下文,传递{2}的shareGroup作为初始化程序init(api:shareGroup:)的第二个参数。
  4. 使用3)中的上下文初始化您的GLKView。
  5. 另外,请记住上下文之间的you can not share Vertex Array Objects。我曾经使用第二个上下文实现了异步后台加载,但是必须在后台初始化纹理,VBO和IBO,然后在主线程上使用rendez-vouz(同步)(例如,使用GCD)来组装VAO。真正的痛苦......