Класс QOpenGLTimerQuery
Класс QOpenGLTimerQuery оборачивает объект запроса таймера OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLTimerQuery> |
| CMake: | find_package(Qt6 COMPONENTS OpenGL REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
| qmake: | QT += opengl |
| С момента: | Qt 5.1 |
| Наследуется от: | 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 — это управляемые OpenGL ресурсы для измерения времени выполнения последовательностей команд OpenGL на графическом процессоре.
OpenGL предлагает различные уровни поддержки запросов таймера в зависимости от версии OpenGL и наличия расширений ARB_timer_query или EXT_timer_query. Поддержка может быть сведена к следующему:
- OpenGL >=3.3 предоставляет полную поддержку всех функций запросов таймера.
- OpenGL 3.2 с расширением ARB_timer_query предоставляет полную поддержку всех функций запросов таймера.
- OpenGL <=3.2 с расширением EXT_timer_query предоставляет ограниченную поддержку, так как отсчёт времени графического процессора запросить нельзя. Места, где это влияет на функции, предоставляемые классами Qt, будут выделены в документации функций.
- OpenGL ES 2 (и OpenGL ES 3) не поддерживают запросы таймера OpenGL.
OpenGL представляет время с точностью до 1 наносекунды (1e-9 секунд). Вследствие этого 32-битные целые числа дадут только общее возможное время примерно 4 секунды, что может быть легко превышено при плохой производительности или длительных операциях. Поэтому OpenGL использует 64-битные целочисленные типы для представления времени. Переменная GLuint64 имеет достаточно ширины, чтобы содержать время длительностью сотни лет, что вполне достаточно для потребностей в реальном времени рендеринга.
Как и другие классы Qt OpenGL, QOpenGLTimerQuery имеет функцию create() для создания базового объекта OpenGL. Это позволяет разработчику гарантировать наличие действительного текущего контекста OpenGL в нужный момент.
После создания запросы таймера можно выполнить несколькими способами. Самый простой способ — ограничить блок команд вызовами begin() и end(). Это инструктирует OpenGL измерить время, затраченное на выполнение всех команд, выпущенных до begin(), до завершения всех команд, выпущенных до end().
В конце кадра мы можем получить результаты, вызвав waitForResult(). Как следует из названия этой функции, она блокирует выполнение процессора, пока OpenGL не уведомит о том, что результат запроса таймера доступен. Чтобы избежать блокировки, можно проверить, доступен ли результат запроса, вызвав isResultAvailable(). Обратите внимание, что современные графические процессоры имеют глубокую конвейерную архитектуру, и результаты запросов могут не стать доступными в течение 1-5 кадров после их выдачи.
Обратите внимание, что OpenGL не позволяет вкладывать или переплетать несколько запросов таймера с помощью begin() и end(). Использование нескольких запросов таймера и recordTimestamp() позволяет избежать этой ограничения. При использовании recordTimestamp() результат можно получить в более позднее время, используя isResultAvailable() и waitForResult(). Qt предоставляет удобный класс QOpenGLTimeMonitor, который помогает при использовании нескольких объектов запроса.
См. также QOpenGLTimeMonitor.
Документация по функциям-членам
QOpenGLTimerQuery::QOpenGLTimerQuery(QObject *parent = nullptr)
Создаёт экземпляр QOpenGLTimerQuery с указанным parent. Вы должны вызвать create() с допустимым контекстом OpenGL перед использованием.
[virtual] QOpenGLTimerQuery::~QOpenGLTimerQuery()
Удаляет QOpenGLTimerQuery и базовый ресурс OpenGL.
void QOpenGLTimerQuery::begin()
Помечает начальную точку в очереди команд OpenGL для последовательности команд, которые необходимо измерить этим объектом запроса.
Полезно для простых случаев. Обычно лучше использовать recordTimestamp().
См. также end(), isResultAvailable(), waitForResult() и recordTimestamp().
bool QOpenGLTimerQuery::create()
Создаёт базовый объект запроса таймера OpenGL. Для успешного выполнения этой функции должен быть действительный контекст OpenGL, текущий для данного объекта.
Возвращает true если объект запроса таймера OpenGL был успешно создан.
void QOpenGLTimerQuery::destroy()
Удаляет базовый объект запроса таймера OpenGL. Контекст, который был текущим при вызове create(), должен быть текущим при вызове этой функции.
void QOpenGLTimerQuery::end()
Помечает конечную точку в очереди команд OpenGL для последовательности команд, которые необходимо измерить этим объектом запроса.
Полезно для простых случаев. Обычно лучше использовать recordTimestamp().
См. также begin(), isResultAvailable(), waitForResult() и recordTimestamp().
bool QOpenGLTimerQuery::isCreated() const
Возвращает true если базовый объект запроса OpenGL был создан. Если это возвращает true и связанный контекст OpenGL текущий, то вы можете выдать запросы с помощью этого объекта.
bool QOpenGLTimerQuery::isResultAvailable() const
Возвращает true если результат запроса таймера OpenGL доступен.
Эта функция неблокирующая и в идеале должна использоваться для проверки доступности результата запроса перед вызовом waitForResult().
См. также waitForResult().
GLuint QOpenGLTimerQuery::objectId() const
Возвращает идентификатор базового объекта запроса OpenGL.
void QOpenGLTimerQuery::recordTimestamp()
Помещает маркер в очередь команд OpenGL для записи графическим процессором отметки времени, когда этот маркер достигнут графическим процессором. Эта функция неблокирующая, и результат станет доступен в какой-то момент позднее.
Доступность результата можно проверить с помощью isResultAvailable(). Результат можно получить с помощью waitForResult(), которая заблокирует выполнение, если результат ещё недоступен.
См. также waitForResult(), isResultAvailable(), begin() и end().
GLuint64 QOpenGLTimerQuery::waitForResult() const
Возвращает результат запроса таймера OpenGL.
Эта функция заблокирует выполнение, пока результат не станет доступным OpenGL. Рекомендуется вызывать isResultAvailable(), чтобы убедиться, что результат доступен, чтобы избежать ненужной блокировки и задержек.
См. также isResultAvailable().
GLuint64 QOpenGLTimerQuery::waitForTimestamp() const
Возвращает текущую метку времени GPU, когда все ранее выпущенные команды OpenGL получены, но не обязательно выполнены GPU.
Эта функция блокируется до тех пор, пока результат не будет возвращен.
См. также recordTimestamp().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qopengltimerquery.html