Класс QOpenGLTimerQuery
Класс QOpenGLTimerQuery оборачивает объект запроса таймера OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLTimerQuery> |
| qmake: | QT += gui |
| С момента: | Qt 5.1 |
| Наследуется от: | QObject |
Открытые функции
| QOpenGLTimerQuery(QObject *parent = Q_NULLPTR) | |
| ~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 |
- 32 открытых функций, унаследованных от QObject
Дополнительные унаследованные члены
- 1 свойство, унаследованное от QObject
- 1 открытый слот, унаследованный от QObject
- 2 сигнала, унаследованные от QObject
- 11 статических открытых членов, унаследованных от QObject
- 9 защищённых функций, унаследованных от QObject
Подробное описание
Класс QOpenGLTimerQuery оборачивает объект запроса таймера OpenGL.
Объекты запросов таймера 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 = Q_NULLPTR)
Создаёт экземпляр QOpenGLTimerQuery с заданным parent. Необходимо вызвать create() с допустимым контекстом OpenGL перед использованием.
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
Возвращает текущую отметку времени графического процессора, когда все ранее выданные команды OpenGL были получены, но не обязательно выполнены графическим процессором.
Эта функция блокируется до тех пор, пока результат не будет возвращён.
См. также recordTimestamp().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qopengltimerquery.html