0

我正在学习如何在我的 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 的速度绘制,但是当我运行上面的代码时,它只绘制一个框。

我在网上搜索并找不到导致问题的原因。

非常感谢您的帮助!

4

1 回答 1

1

调度块中的代码不起作用。当它被执行时,该帧的所有 OpenGL 状态早就被销毁了。如果您要在该块中调用 glGetError(),我相信它会告诉您同样的情况。您需要确保所有绘图代码都在该 glkView 方法中完成,以使 OpenGL 状态有效。当您执行该调度时,您实际上是将该绘图代码的执行分流到该方法的范围之外。

于 2012-04-29T16:58:19.770 回答