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 で 1 つのボックスを描画し、うまく動作する場合は 1fps で別のボックスを描画しますが、上記のコードを実行すると、1 つのボックスしか描画されません。

Web を検索しましたが、問題の原因がわかりません。

助けてくれてありがとう!

4

1 に答える 1

1

ディスパッチ ブロックのコードは機能しません。それが実行されるまでに、そのフレームのすべての OpenGL 状態はかなり前に破棄されています。そのブロックに glGetError() を呼び出すと、同じことがわかるはずです。OpenGL の状態を有効にするには、すべての描画コードがその glkView メソッドで実行されていることを確認する必要があります。そのディスパッチを行うと、基本的に、その描画コードの実行がそのメソッドの範囲外に追いやられます。

于 2012-04-29T16:58:19.770 に答える