2012-04-29 10 views
0

私は自分のiOS Opengl-esアプリでスレッディングを使う方法を学んでいます。私は、OpenGLのゲームのテンプレートのコードを修正しようとしました:glkviewでdispatch_asyncを使用するには?

- (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つのボックスだけを描画します。

ウェブを検索したところ、問題の原因を見つけることができませんでした。

ありがとうございました!

答えて

1

ディスパッチブロックのコードは機能しません。実行されるまでに、そのフレームのOpenGL状態はすべて破壊されてしまいます。そのブロック内でglGetError()を呼び出す場合は、同じことを伝えると確信しています。 OpenGL状態を有効にするには、glkViewメソッドですべての描画コードが完了していることを確認する必要があります。そのディスパッチを行うとき、あなたは本質的にその描画コードの実行をそのメソッドの範囲外に分けています。

+0

私はここで同じ問題を偶然見つけました。この回答は絶対に正しいです。しかし、2番目のスレッドで描画を行う方法はありますか? –

関連する問題