我正在学习如何在我的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绘制另一个框,但是当我运行上面的代码时,它只绘制一个框。
我搜索了网络,无法找到导致问题的原因。
非常感谢您的帮助!
答案 0 :(得分:1)
调度块中的代码不起作用。当它被执行时,该帧的所有OpenGL状态将很久以来被破坏。如果您在该块中调用glGetError(),我相信它会告诉您相同的内容。您需要确保所有绘图代码都在该glkView方法中完成,以使OpenGL状态有效。当您执行该调度时,您实际上是将该绘图代码的执行从该方法的范围中分流出来。