2013-08-13 8 views
7

OpenGL関数は、あたかも同期して動作しているかのように定義されています。しかし、レンダリング関数(とその他)は、しばしばGPUによって非同期に実行されます。 OpenGLはこれを効果的に隠すでしょう:あなたが操作の結果を必要とする何かを行うと(レンダリングされたフレームバッファからの読み込みなど)、OpenGLはGPUがそのポイントに達するまでCPUの動作を停止します。OpenGLの操作が終了したかどうかを確認する方法はありますか?

CPUは基本的にGPUが完了するまでブロックするので、機能はありますがパフォーマンスはほとんどありません。特定の操作が完了したかどうかを判断する方法があるので、従属操作があまりCPUをブロックすることなく実行されることを知ることができますか?

答えて

6

はい、あります。 OpenGL 3.2以降またはARB_sync拡張機能にアクセスできると仮定します。

特定のコマンドがいつ終了したかを知りたい場合は、そのコマンドを発行した直後に「フェンス」sync objectをコマンドストリームに挿入できます。これはglFenceSync functionで行われます。

この関数が返すポインタを格納する必要があります。そのポインタを手近にして、フェンスがglGetSync functionで通知されているかどうかをチェックすることによって、フェンスが完了したかどうかを問い合わせることができます。このように:

GLint isSignaled = 0; 
glGetSync(syncObj, GL_SYNC_STATUS, 1, NULL, &isSignaled); 

if(isSignaled == GL_SIGNALED) 
{ 
    //Prior commands have completed. 
} 
else 
{ 
    //Not done yet. 
} 

他のものを使い果たした場合は、同期オブジェクトが終了するまで待つ必要はありません。あなたは、あなたがやりたいOpenGLプロセスを何でも行うことができます。それはあなたのCPUブロックを誘発するでしょう。

同期オブジェクトが終了したら、を削除する必要があります。glDeleteSync functionを使用してください。

+0

大きな質問ですが、同時に質問と回答の両方が大丈夫ですか? ;)また、このような同期チェックでパイプラインに不要なオーバーヘッドが追加されることはありませんか? –

+1

@MichaelIV: "*しかし、同時に尋ねると答えるのは大丈夫ですか?"はい。これは、あなたが質問をするときに、質問する前にすぐに答えることのできるボックスが底にある理由です。 「不要なオーバーヘッド」を加えることについては、フェンスはかなり軽量であると予想されます。内部ドライバプロセスは常にフェンスを使用します。バッファオブジェクトなどで完了した時点を知ることができます。 –

関連する問題