2

Cocoa/OpenGL アプリを作成しています。一度に約 2 秒間、すべてのビデオ フレームを制御し、デジタル IO デバイスに書き込む必要があります。openGL 呼び出しを行った後、メイン スレッドを手放した場合 (0.01 秒の間隔でタイマー ファイア メソッド内で openGL 呼び出しを行った場合など)、openGLview は への呼び出しごとに更新されますglFinish()
しかし、2 秒間の while ループのようにメイン スレッドをビジー状態にしておくと、openGl 呼び出しは機能しません (驚くべきことに、最初の呼び出しglFinish()は機能しますが、残りは機能しません)。ドキュメントによると、glFinishgl コマンドが実行されるまでスレッドをブロックする必要があります。ここで何が起こっているのかを理解するのを手伝ってくれるか、この問題の解決策を提供してください。明確にするために、Snow Leopard のすべてのデジタル IO ポートに書き込むことで、フレームを欠落させたり、各フレームの更新をマークしたりせずに、200 フレームを次々に提示したいと考えています (これには問題はありません)。

4

1 に答える 1

4

これは私の部門ではありません-私自身かなりのバニラNSOpenGLViewユーザーですが、Mac OpenGLドキュメントCVDisplayLinkから、これには(Q&A1385 )を使用したいようです。それがうまくいかなくても、そこにある他のものがおそらく役立つはずです。

編集

私はこれについていくつかの基本的なテストを行っただけですが、最初に正しい OpenGL コンテキストを設定し、次に各フレームの後にバッファを交換する限り、やりたいことができるように見えます (ダブル バッファ コンテキストを使用していると仮定します):

// inside an NSOpenGLView subclass, somewhere outside the usual drawing loop
- (void) drawMultipleFrames
{
    // it might be advisable to also do a [self lockFocus] here,
    // although it seems to work without that in my simple tests

    [[self openGLContext] makeCurrentContext];

    // ... set up common OpenGL state ...

    for ( i = 0; i < LOTS_OF_FRAMES; ++i )
    {
        // ... draw your frame ...

        glFinish();
        glSwapAPPLE();
    }

    // unlockFocus here if locked earlier
}

私は以前[[self openGLContext] flushBuffer]、代わりに各フレームの最後で使用しようとしました。これは必要ありませんがglSwapAPPLE、ブロックしないglFinishため、フレームが互いに踏みにじられる可能性があります。これは他のアプリでも問題なく動作するようで、バックグラウンドで実行されますが、もちろん YMMV.

于 2011-06-21T00:13:02.250 に答える