2

CPUとGPU間のデータ転送にPBOを使用するマルチスレッドOpenGLアプリケーションがあります。

PBOの割り当てをプールしましたが、プールが空の場合、OpenGLスレッドがバッファーを割り当てることができるポイントに到達するまで(つまり、現在のフレームのレンダリングが終了するまで)、非openglスレッドをしばらくブロックする必要があります。この待機により、特定の状況でラグスパイクが発生しますが、これは避けたいと思います。

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

4

1 に答える 1

4

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

そうは言っても、2つの懸念があります。

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

「割り当て」とglBufferDataは、以前に使用されたものとは異なるサイズまたはドライバーヒントを使用して、以前に割り当てられたバッファーを呼び出すことを意味します。または、とを使用glGenBuffersglDeleteBuffersて。これらのどちらもフレーム内で発生するべきではありません。

次に、バッファを無効にしても「ラグスパイク」が発生することはありません。「無効化」とはglBufferData、同じサイズと使用法のヒントを使用して、またはビットを使用しglMapBufferRangeてバッファを再割り当てすることを意味しGL_INVALIDATE_BUFFERます。詳細については、バッファオブジェクトデータをストリーミングする方法についてこのページを参照してください。問題が発生している場合は、NVIDIAハードウェアを使用していて、間違ったバッファオブジェクトヒントを使用している可能性があります(つまり、STREAMを使用します)。

于 2012-01-25T01:17:47.280 に答える