Класс QOpenGLTimerQuery
Класс QOpenGLTimerQuery оборачивает объект запроса таймера OpenGL. Подробнее...
| Заголовок: | #include <QOpenGLTimerQuery> |
| qmake: | QT += gui |
| С тех пор: | 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 |
- 34 открытых функций унаследовано от QObject
Дополнительные унаследованные члены
- 1 свойство унаследовано от QObject
- 1 открытый слот унаследован от QObject
- 2 сигнала унаследованы от QObject
- 1 открытая переменная унаследована от QObject
- 10 статические открытые члены унаследованы от QObject
- 9 защищённых функций унаследованы от QObject
- 2 защищённых переменных унаследованы от 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(). Как следует из названия этой функции, она блокирует выполнение CPU до тех пор, пока 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/archives/qt-5.11/qopengltimerquery.html