Как использовать dispatch_async в glkview?
Я учусь использовать многопоточность в своем приложении 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);
});
});
}
Если он работает хорошо, он рисует прямоугольник со скоростью 60 кадров в секунду и еще один со скоростью 1 кадр / с, но когда я запускаю приведенный выше код, он рисует только один прямоугольник.
Я искал в Интернете и не могу найти причину проблемы.
Большое спасибо за любую помощь!
1 ответ
Код в блоке отправки не будет работать. К тому времени, когда он будет выполнен, все состояние OpenGL для этого кадра уже давно будет уничтожено. Если бы вы поместили вызов glGetError() в этот блок, я уверен, что он скажет вам то же самое. Вы должны убедиться, что весь ваш код рисования выполнен в этом методе glkView, чтобы состояние OpenGL было действительным. Когда вы выполняете эту диспетчеризацию, вы по существу исключаете выполнение этого кода чертежа из области действия этого метода.