0

私は、NSWindow contentView 内に並べて配置された2 つNSOpengGLViewの s (leftGLViewおよび) で構成される OSX アプリに取り組んでいます。rightGLView2 つのビューは を共有しませんNSOpenGLContextが、両方ともダブル バッファリングされ、バッファー スワップをモニター リトレースと同期します。

Aはセットアップされ、最初のもの(たとえば左側のもの)のandにCVDisplayLinkリンクされています。NSOpenGLContextNSOpenGLPixelFormatNSOpenGLView

CVDisplayLink コールバック内で、次のコードを使用して両方のビューに描画します。

-(CVReturn)draw {

     NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

     CGLLockContext([[leftGLView openGLContext] CGLContextObj]);
     [[leftGLView openGLContext] makeCurrentContext];
     ... draw code ...
     [[leftGLView openGLContext] flushBuffer];
     CGLUnlockContext([[leftGLView openGLContext] CGLContextObj]);

     CGLLockContext([[rightGLView openGLContext] CGLContextObj]);
     [[rightGLView openGLContext] makeCurrentContext];
     ... draw code ...
     [[rightGLView openGLContext] flushBuffer];
     CGLUnlockContext([[rightGLView openGLContext] CGLContextObj]);

     [pool release];
     return kCVReturnSuccess;
}

このアプローチの問題点は、この 2 つflushBufferが常に同期されているとは限らないことです。右側の NSOpenGLView は、左側よりも遅く更新されることがあります (次のモニターの更新時など)。-flushBufferApple のドキュメントには次のように記載されているため、これは完全に予想外のことではありません。

スワップ間隔コンテキスト属性 (NSOpenGLCPSwapInterval を参照) に従って、flushBuffer が呼び出された直後ではなく、モニターの垂直リトレース中にコピーが行われる場合があります。暗黙的な glFlush は、戻る前に flushBuffer によって実行されます。最適なパフォーマンスを得るために、アプリケーションは、flushBuffer を呼び出す直前に glFlush を呼び出さないでください。後続の OpenGL コマンドは、flushBuffer を呼び出した直後に発行できますが、バッファーのコピーが完了するまで実行されません。

ただし、この場合、2 つの異なるNSOpenGLContextバッファーがあるため、2 つのバッファーを一緒にフラッシュすることが可能です。

これをさらに調査するために-flushBuffer、バッファーをスワップ (またはコピー) した後にのみ戻ると仮定しました。これは、私が観察している動作を説明できます。したがって、補助スレッドを切り離して flushBuffer 呼び出しを実行しようとしましたが、違いはありませんでした。

私は最終的に 2 つの異なるCVDisplayLinks を使用しようとしました。1 つは左側の GLView 用で、もう 1 つは右側の GLView 用です。ただし、この手法でも問題は解決しないようで、2 つの CVDisplayLink スレッドの同期を維持するという複雑さが増します。

flushBuffer2 つの NSOpenGLViews 間で 2 つを同期させる方法はありますか?

4

0 に答える 0