QOpenGLTimerQuery Class
QOpenGLTimerQuery クラスは、OpenGL タイマークエリオブジェクトをラップしています。詳細...
| ヘッダー: | #include <QOpenGLTimerQuery> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
| qmake: | QT += opengl |
| 継承元: | QObject |
- 継承されたメンバーを含むすべてのメンバーの一覧
- QOpenGLTimerQuery は、3D レンダリングの一部です。
パブリック関数
| QOpenGLTimerQuery(QObject *parent = nullptr) | |
| virtual | ~QOpenGLTimerQuery() |
| void | begin() |
| bool | create() |
| void | destroy() |
| void | end() |
| bool | isCreated() const |
| bool | isResultAvailable() const |
| GLuint | objectId() const |
| void | recordTimestamp() |
| GLuint64 | waitForResult() const |
| GLuint64 | waitForTimestamp() const |
詳細な説明
OpenGL タイマークエリオブジェクトは、GPU 上で実行される一連の OpenGL コマンドの実行時間を測定するための、OpenGL によって管理されるリソースです。
OpenGL は、お使いの OpenGL のバージョンや、ARB_timer_query または EXT_timer_query 拡張機能の有無に応じて、タイマークエリに対してさまざまなレベルのサポートを提供しています。そのサポート状況は次のようにまとめられます。
- OpenGL 3.3 以降では、すべてのタイマークエリ機能が完全にサポートされています。
- ARB_timer_query 拡張機能を備えた OpenGL 3.2 では、すべてのタイマー照会機能が完全にサポートされています。
- EXT_timer_query 拡張機能を備えた Qt OpenGL <=3.2 では、GPU のタイムスタンプを照会できないという点で、サポートが制限されています。これが Qt クラスが提供する関数にどのような影響を与えるかについては、関数のドキュメント内で明記されています。
- OpenGL ES 2(および OpenGL ES 3)は、OpenGL タイマークエリを一切サポートしていません。
OpenGL は、1 ナノ秒(1e-9 秒)の粒度で時間を表現します。この結果、32 ビット整数では合計で約 4 秒分の持続時間しか表現できず、パフォーマンスの低い操作や長時間の操作では、この上限を簡単に超えてしまうことになります。 そのため、OpenGL では時間を表現するために 64 ビットの整数型を使用しています。GLuint64 変数は、数百年にわたる期間を格納するのに十分な幅を持っており、リアルタイムレンダリングのニーズには十分です。
他のQt OpenGL クラスと同様に、QOpenGLTimerQueryには、基盤となるOpenGLオブジェクトを作成するためのcreate()関数が用意されています。これは、開発者がその時点で有効なOpenGLコンテキストが存在することを確認できるようにするためです。
作成後、タイマークエリはいくつかの方法のいずれかで発行できます。最も簡単な方法は、begin() およびend() の呼び出しでコマンドブロックを区切ることです。これにより、OpenGL に対して、begin() の前に発行されたすべてのコマンドの完了から、end() の前に発行されたすべてのコマンドの完了までの時間を測定するよう指示します。
フレームの終了時に、waitForResult() を呼び出すことで結果を取得できます。この関数の名前が示す通り、OpenGL からタイマー照会の結果が利用可能になったという通知があるまで、CPU の実行はブロックされます。ブロックを回避するには、isResultAvailable() を呼び出して、照会結果が利用可能かどうかを確認することができます。 なお、最新のGPUは高度にパイプライン化されているため、クエリ結果が発行されてから1~5フレームほど経過するまで利用可能にならない場合があります。
なお、OpenGLでは、begin()およびend()を使用した複数のタイマークエリのネストやインターリーブは許可されていません。複数のタイマークエリとrecordTimestamp()を使用することで、この制限を回避できます。recordTimestamp()を使用する場合、結果は後でisResultAvailable()およびwaitForResult()を使用して取得できます。Qtには、複数のクエリオブジェクトの使用を支援する利便性クラスQOpenGLTimeMonitor が用意されています。
QOpenGLTimeMonitorも参照してください 。
メンバ関数のドキュメント
[explicit] QOpenGLTimerQuery::QOpenGLTimerQuery(QObject *parent = nullptr)
指定されたparent を使用して、QOpenGLTimerQueryのインスタンスを作成します。使用するには、有効なOpenGLコンテキストを指定してcreate()を呼び出す必要があります。
[virtual noexcept] QOpenGLTimerQuery::~QOpenGLTimerQuery()
QOpenGLTimerQuery およびその基盤となる OpenGL リソースを破棄します。
void QOpenGLTimerQuery::begin()
このクエリオブジェクトによってタイミング制御される一連のコマンドについて、OpenGLコマンドキュー内の開始位置を指定します。
これは単純なユースケースで役立ちます。通常は、recordTimestamp() を使用する方が望ましいです。
end()、isResultAvailable()、waitForResult()、およびrecordTimestamp()も参照してください 。
bool QOpenGLTimerQuery::create()
基盤となる OpenGL タイマークエリオブジェクトを作成します。この関数が成功するには、クエリオブジェクトをサポートする有効な OpenGL コンテキストがアクティブである必要があります。
OpenGLタイマークエリオブジェクトが正常に作成された場合、true を返します。
void QOpenGLTimerQuery::destroy()
基になる OpenGL タイマー照会オブジェクトを破棄します。この関数を呼び出す際には、create() が呼び出された時点でアクティブだったコンテキストが、現在もアクティブである必要があります。
void QOpenGLTimerQuery::end()
このクエリーオブジェクトによってタイミングが測定される一連のコマンドについて、OpenGLコマンドキュー内の終了点を指定します。
これは単純なユースケースで有用です。通常は、recordTimestamp() を使用する方が望ましいです。
begin()、isResultAvailable()、waitForResult()、およびrecordTimestamp()も参照してください 。
bool QOpenGLTimerQuery::isCreated() const
基になる OpenGL クエリオブジェクトが作成されている場合、true を返します。これがtrue を返し、かつ関連する OpenGL コンテキストが現在のコンテキストである場合、このオブジェクトを使用してクエリを発行することができます。
bool QOpenGLTimerQuery::isResultAvailable() const
OpenGL タイマークエリの結果が利用可能な場合、true を返します。
この関数はノンブロッキングであり、waitForResult() を呼び出す前に、クエリ結果が利用可能かどうかを確認するために使用するのが理想的です。
waitForResult()も参照してください 。
GLuint QOpenGLTimerQuery::objectId() const
基になる OpenGL クエリオブジェクトの ID を返します。
void QOpenGLTimerQuery::recordTimestamp()
GPUがこのマーカーに到達した際のタイムスタンプを記録するために、OpenGLコマンドキューにマーカーを配置します。この関数はノンブロッキングであり、結果は後ほど利用可能になります。
結果が利用可能かどうかは、isResultAvailable() で確認できます。結果はwaitForResult() で取得できますが、結果がまだ利用できない場合はこの関数はブロックします。
waitForResult()、isResultAvailable()、begin()、およびend()も参照してください 。
GLuint64 QOpenGLTimerQuery::waitForResult() const
OpenGL タイマーのクエリ結果を返します。
この関数は、OpenGL によって結果が利用可能になるまでブロックします。不要なブロックや処理の停滞を避けるため、結果が利用可能であることを確認するために `isResultAvailable()` を呼び出すことを推奨します。
isResultAvailable()も参照してください 。
GLuint64 QOpenGLTimerQuery::waitForTimestamp() const
以前に発行されたすべての OpenGL コマンドが GPU によって受信されたが、必ずしも GPU によって実行されたわけではない状態での、GPU の現在のタイムスタンプを返します。
この関数は、結果が返されるまでブロックします。
recordTimestamp()も参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.