2012-01-25 14 views
2

私は、CPUとGPU間のデータ転送にPBOを使用するマルチスレッドOpenGLアプリケーションを持っています。別のスレッドにPBOを割り当てるか?

私はPBOの割り当てをプールしましたが、プールが空の場合、OpenGLスレッドがバッファを割り当てることができるポイントに達するまで、非OpenGLスレッドはしばらくブロックしなければなりません(つまり、 )。この待機は、私が避けたいと思う特定の状況では、いくつかの遅れのスパイクを引き起こしています。

「メイン」OpenGLスレッドで使用される別のスレッドにPBOを割り当てることは可能ですか?

答えて

4

はい、あるスレッドで別のスレッドで使用できるオブジェクトを作成できます。これを行うには、新しいGLコンテキストが必要です。

これには2つの懸念があります。

まず、「PBOの割り当て」という意味に依存します。フレームの途中でバッファオブジェクトを割り当ててはいけません。必要なすべてのバッファを前もって割り当てる必要があります。それを使う時が来たら、あなたが持っているものだけを使うことができます。

"allocate"とは、これまで使用していたものとは異なるサイズまたはドライバのヒントを使用して、事前に割り当てられたバッファにglBufferDataを呼び出すことです。または、glGenBuffersglDeleteBuffersを使用してください。これらはどちらもフレーム内で発生しません。

第2に、バッファを無効にすると、「遅延スパイク」が発生しません。 "無効化"とは、同じサイズと使用方法のヒントを使用してglBufferDataでバッファを再割り当てするか、GL_INVALIDATE_BUFFERビットでglMapBufferRangeを使用することです。詳細はthis page on how to stream buffer object dataをご覧ください。問題が発生している場合は、おそらくNVIDIAハードウェア上で、間違ったバッファオブジェクトのヒントを使用しています(つまり、STREAMを使用します)。

+0

バッファオブジェクトのストリーミング情報へのリンクを忘れたと思います。 – genpfault

+0

@genpfault:修正されました。ありがとう。 –

関連する問題