9

OpenGL 関数は、同期的に動作するかのように定義されています。ただし、レンダリング関数 (およびその他) は、多くの場合、GPU によって非同期で実行されます。OpenGL はこれを効果的に隠します: 操作の結果を必要とする何かを行う場合 (レンダリングされたフレームバッファーからの読み取りなど)、OpenGL は GPU がそのポイントに到達するまで CPU 操作を停止します。

これは機能的ですが、CPU は基本的に GPU が完了するまでブロックするため、パフォーマンスには理想的とは言えません。特定の操作が完了したかどうかを判断する方法はありますか? その結果、依存する操作が CPU のブロックをあまり行わずに実行されることがわかりますか?

4

1 に答える 1

8

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

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

この関数によって返されるポインターを格納する必要があります。glGetSyncそのポインターを使用して、フェンスが関数で通知されているかどうかを確認することで、フェンスが完了したかどうかを照会できます。このような:

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これを行うには、関数を使用します。

于 2013-08-13T19:43:09.207 に答える