Неясно, из спецификации OpenGL на объекты синхронизации, использовать ли glGetSynciv
или glClientWaitSync
в случае, если я хочу проверить сигнализация объекта синхронизации без ожидания. Как сравнить следующие две команды с точки зрения поведения и производительности:
GLint syncStatus;
glGetSynciv(*sync, GL_SYNC_STATUS, sizeof(GLint), NULL, &syncStatus);
bool finished = syncStatus == GL_SIGNALED;
против
bool finished = glClientWaitSync(*sync, 0 /*flags*/, 0 /*timeout*/) == ALREADY_SIGNALED;
Некоторые вопросы:
- Выполняет ли
glGetSynciv
двусторонний переход на сервер GL? - Является ли какой-либо метод предпочтительным с точки зрения поддержки/ошибок драйверов?
- Может ли метод зайти в тупик или не вернуться сразу?
В некотором контексте:
- Это для видеопроигрывателя, который передает изображения с физического источника на GPU для рендеринга.
- Один поток - это потоковая передача/непрерывная загрузка текстур, а другой поток передает их после завершения загрузки. Каждый кадр рендеринга мы проверяем, закончилась ли следующая текстура. Если это так, то мы начинаем рендерить эту новую текстуру, в противном случае продолжаем использовать старую текстуру.
- Решение - только клиентская сторона, и я не хочу ждать вообще, но быстро продолжаю отображать правильную текстуру.
Оба метода имеют примеры людей, использующих их с целью не ждать, но никто, кажется, не обсуждает достоинства использования того или другого.