如何在glkview中使用dispatch_async?

时间:2012-04-29 15:51:31

标签: ios multithreading opengl-es

我正在学习如何在我的iOS Opengl-es应用程序中使用线程。我试图修改opengl游戏模板代码:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindVertexArrayOES(_vertexArray);

    // Render the object with GLKit
    [self.effect prepareToDraw];

    glDrawArrays(GL_TRIANGLES, 0, 36);

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        dispatch_async(dispatch_get_main_queue(), ^{
            // Render the object again with ES2
            glUseProgram(_program);

            glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
            glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);

            glDrawArrays(GL_TRIANGLES, 0, 36);
        });
    });
}

它以60fps绘制一个框,如果它运行良好,则以1fps绘制另一个框,但是当我运行上面的代码时,它只绘制一个框。

我搜索了网络,无法找到导致问题的原因。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

调度块中的代码不起作用。当它被执行时,该帧的所有OpenGL状态将很久以来被破坏。如果您在该块中调用glGetError(),我相信它会告诉您相同的内容。您需要确保所有绘图代码都在该glkView方法中完成,以使OpenGL状态有效。当您执行该调度时,您实际上是将该绘图代码的执行从该方法的范围中分流出来。