如何在glkview中使用dispatch_async?

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

我search了网页,找不到是什么原因造成的问题。

非常感谢您的帮助!

调度块中的代码不起作用。 当它被执行的时候,那个帧的所有OpenGL状态早已被破坏了。 如果你要在该块中调用glGetError(),我相信它会告诉你相同的。 你需要确保你所有的绘图代码都是在glgView方法中完成的,以使OpenGL状态有效。 当你做这个调度的时候,你基本上是将那个绘图代码的执行从该方法的范围之外分stream出来。