1

ビデオを描画する firebreath (mac os) でプラグインを作成します コンテキストを取得するウィンドウを作成します。別のスレッドで実行されているライブラリをウィンドウに描画したいと思います。

私はどのように行いますか?

4

1 に答える 1

2

一度に複数のスレッドから同時に使用しない限り、複数のスレッドからOpenGLコンテキストを使用できます。例えば

スレッドA:

[myContext makeCurrentContext];
// Do something with the context...
// ... then release it on the thread.
[NSOpenGLContext clearCurrentContext];
// Tell Thread B that we released the context.
// Wait for Thread B to finish...
// Grab the context again.
[myContext makeCurrentContext];
// Do something with the context...

スレッドB:

// Wait for Thread A to release the context...
[myContext makeCurrentContext];
// Do something with the context...
// ... then release it on the thread.
[NSOpenGLContext clearCurrentContext];
// Let Thread A know, that we are done with the context.

もう1つの可能性は、セカンダリ共有コンテキストを使用することです。共有コンテキストはその親コン​​テキストと同じリソースを共有するため、共有コンテキスト(セカンダリスレッドで使用)でテクスチャを作成し、セカンダリスレッドでそのテクスチャにビデオをレンダリングしてから、メインスレッドにテクスチャをレンダリングさせることができます(これは、次のフレームをセカンダリスレッドのテクスチャにレンダリングする前に、メインスレッドの親コンテキストでも使用できます。

アップデート

CGLフレームワークを使用した上記と同じコード:

スレッドA:

err = CGLSetCurrentContext(myContext);
// Do something with the context...
// ... then release it on the thread.
err = CGLSetCurrentContext(NULL);
// Tell Thread B that we released the context.
// Wait for Thread B to finish...
// Grab the context again.
err = CGLSetCurrentContext(myContext);
// Do something with the context...

スレッドB:

// Wait for Thread A to release the context...
err = CGLSetCurrentContext(myContext);
// Do something with the context...
// ... then release it on the thread.
err = CGLSetCurrentContext(NULL);
// Let Thread A know, that we are done with the context.
于 2013-02-19T14:17:24.483 に答える