Класс 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(). Как следует из названия этой функции, она блокирует выполнение 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().
END_OF_DOCUMENT_MARKERGLuint64 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.2/qopengltimerquery.html