0

同じEAGLContext全体を使用すると、いくつかの問題が発生しEAGLViewsます。2 つの View Controller があり、それぞれに 1 つのEAGLView.

各ビュー コントローラは新しいEAGLContextを割り当て、後続のフレームバッファ/カラーバッファがそれぞれの ごとに作成されますEAGLViewが、これはメモリ リソースの無駄です。

EAGLContext異なるフレームバッファ/カラーバッファを異なるにバインドするだけで、ViewController間で同じものを使用できることを私は知っていますEAGLViews:

複数の OpenGL ビューと UIKit の使用

しかし、私はこれまでのところそれを達成することができませんでした。

何か案は?

前もって感謝します。

4

2 に答える 2

1

最後に問題を解決することができました。

私が使用していたView Controllerの1つで:

dispatch_async(openGLESContextQueue, ^{

        [(EAGLView *)self.view setFramebuffer];

        (...opengl draw code...)

        [(EAGLView *)self.view presentFramebuffer];

    });

マルチスレッド環境で EAGLContext を使用する場合は、他のスレッドが同時にアクセスしないように注意する必要があります。

@syncronized(context) { ...opengl drawing here...}

次を使用して、別のViewControllerに制御を渡す前に現在のdispatch_queueを排出します(presentViewController :を介して)。

dispatch_sync(openGLESContextQueue, ^{});

したがって、これら 2 つのトリックを使用することで、複数のビューで 1 つの EAGLContext を使用することができました。EAGLContext の現在の状態にも特に注意を払う必要があります。最初のビューで私が持っていたので、私は予期しない結果を持っていました:

glVertexPointer(2, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
glEnableClientState(GL_COLOR_ARRAY);

2番目のビューでは、まったく異なる描画コードがあり、もちろん、使用するのを忘れていました:

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

そして出来上がり!

ありがとう :)

于 2011-10-04T17:59:38.383 に答える
0

EAGLView実際には単一のクラスではありません。これは、Apple がサンプル ファイルに挿入する傾向がある同じ名前のクラスのファミリです。そのため、特定の変更についてアドバイスすることは比較的困難です。

私の最初の解決策は、単一の shared を販売するシングルトン クラスを作成することでしたEAGLContextEAGLContexts は一度に 1 つのスレッドでしか使用できないため、必ずしも完全な解決策ではありませんが、正確には、プログラムのセマンティクスに依存し、実際の質問とは異なるトピックのように感じます。

Xcode 4.1 の「OpenGL ES アプリケーション」テンプレートでは、ビューの外側でコンテキストが作成されますが、以前はビューの内側にあったと思います。これにより、作業が少し楽になります。

于 2011-10-04T12:05:09.770 に答える