QOpenGLTimerQuery Class

QOpenGLTimerQueryクラスは、OpenGLタイマークエリオブジェクトをラップします。詳細...

Header: #include <QOpenGLTimerQuery>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl
Inherits: QObject

パブリック関数

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は、すべてのタイマークエリー機能をフルサポートします。
  • OpenGL <=3.2 with the EXT_timer_query extension(EXT_timer_query拡張付き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コマンドキューにマーカーを置き、GPUがこのマーカーに到達したときのタイムスタンプを記録します。この関数はノンブロッキングで、結果は後で利用可能になります。

結果の可用性はisResultAvailable() で確認できます。結果はwaitForResult() でフェッチできます。この関数は、結果がまだ利用可能でない場合にブロックします。

waitForResult()、isResultAvailable()、begin()、end()も参照

GLuint64 QOpenGLTimerQuery::waitForResult() const

OpenGLタイマークエリの結果を返します。

この関数は、OpenGLによって結果が利用可能になるまでブロックされます。不必要なブロックやストールを避けるために、結果が利用可能であることを確認するためにisResultAvailable() を呼び出すことを推奨します。

isResultAvailable()も参照してください

GLuint64 QOpenGLTimerQuery::waitForTimestamp() const

以前に発行されたすべてのOpenGLコマンドが受信されたが、必ずしもGPUによって実行されたわけではない場合に、GPUの現在のタイムスタンプを返します。

この関数は結果が返されるまでブロックします。

recordTimestamp()も参照してください

本書に含まれる文書の著作権はそれぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。