Он строго зависит от рассматриваемого вызова OpenGL и состояния OpenGL. Когда вы делаете вызовы OpenGL, реализация сначала ставит их в очередь внутри, а затем выполняет их асинхронно для выполнения вызывающей программы. Одной из важных концепций OpenGL являются точки синхронизации. Это операции в рабочей очереди, которые требуют, чтобы вызов OpenGL блокировался до тех пор, пока не будут выполнены определенные условия.
Объекты OpenGL (текстуры, буферные объекты и т. Д.) Являются чисто абстрактными и по спецификации дескриптор объекта в клиентской программе всегда относятся к данным, у объекта есть время вызова функций OpenGL, относящихся к этому объекту. Так возьмите, например, эту последовательность:
glBindTexture(GL_TEXTURE_2D, texID);
glTexImage2D(..., image_1);
draw_textured_quad();
glTexImage2D(..., image_2);
draw_textured_quad();
Первый draw_textured_quad
может вернуться даже задолго до того, что-то было обращено. Однако, делая вызовы, OpenGL создает внутреннюю ссылку на данные, которые в настоящее время удерживаются текстурой. Поэтому, когда glTexImage2D вызывается во второй раз, что может произойти до того, как был сделан первый квадрат, OpenGL должен внутренне создать вторичный объект текстуры, который должен стать текстурой texID
и использоваться вторым вызовом draw_textured_quad
. Если было вызвано glTexSubImage2D
, ему даже пришлось бы сделать модифицированную копию.
Звонки OpenGL будут блокироваться только в том случае, если результат вызова изменяет память на стороне клиента и зависит от данных, сгенерированных предыдущими вызовами OpenGL. Другими словами, при выполнении вызовов OpenGL реализация OpenGL внутренне генерирует дерево зависимостей, чтобы отслеживать, что от этого зависит. И когда точка синхронизации должна блокировать, она будет по крайней мере блокироваться до тех пор, пока не будут выполнены все зависимости.
Да, они, как правило, блокируют функции, я не уверен, поскольку я не делал этого раньше, но я предполагаю, что он будет работать в цикле и обновляться только по мере необходимости, чтобы сохранить частоту кадров. – PsyKzz
@MattPsyK: функции OpenGL, которые не вводят точку синхронизации, не блокируются. – datenwolf
Мои плохие предположения были сделаны. – PsyKzz