Класс 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.0/qopengltimerquery.html