私は、NSWindow contentView 内に並べて配置された2 つNSOpengGLView
の s (leftGLView
および) で構成される OSX アプリに取り組んでいます。rightGLView
2 つのビューは を共有しませんNSOpenGLContext
が、両方ともダブル バッファリングされ、バッファー スワップをモニター リトレースと同期します。
Aはセットアップされ、最初のもの(たとえば左側のもの)のandにCVDisplayLink
リンクされています。NSOpenGLContext
NSOpenGLPixelFormat
NSOpenGLView
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 は、左側よりも遅く更新されることがあります (次のモニターの更新時など)。-flushBuffer
Apple のドキュメントには次のように記載されているため、これは完全に予想外のことではありません。
スワップ間隔コンテキスト属性 (NSOpenGLCPSwapInterval を参照) に従って、flushBuffer が呼び出された直後ではなく、モニターの垂直リトレース中にコピーが行われる場合があります。暗黙的な glFlush は、戻る前に flushBuffer によって実行されます。最適なパフォーマンスを得るために、アプリケーションは、flushBuffer を呼び出す直前に glFlush を呼び出さないでください。後続の OpenGL コマンドは、flushBuffer を呼び出した直後に発行できますが、バッファーのコピーが完了するまで実行されません。
ただし、この場合、2 つの異なるNSOpenGLContext
バッファーがあるため、2 つのバッファーを一緒にフラッシュすることが可能です。
これをさらに調査するために-flushBuffer
、バッファーをスワップ (またはコピー) した後にのみ戻ると仮定しました。これは、私が観察している動作を説明できます。したがって、補助スレッドを切り離して flushBuffer 呼び出しを実行しようとしましたが、違いはありませんでした。
私は最終的に 2 つの異なるCVDisplayLink
s を使用しようとしました。1 つは左側の GLView 用で、もう 1 つは右側の GLView 用です。ただし、この手法でも問題は解決しないようで、2 つの CVDisplayLink スレッドの同期を維持するという複雑さが増します。
flushBuffer
2 つの NSOpenGLViews 間で 2 つを同期させる方法はありますか?