glFlush () по сравнению с glFinish ()
Q: Что является различием между glFlush() и glFinish()?
A: Команды OpenGL сразу не выполняются. Вместо этого они представлены буферу команд, тогда питающемуся в к аппаратным средствам. glFlush() и glFinish(), команды оба используются для принуждения представления буфера команд к аппаратным средствам для выполнения. glFlush(), вызывает все команды OpenGL, в настоящее время ставившиеся в очередь, чтобы быть представленным аппаратным средствам для выполнения. Эта функция возвращается сразу передав незаконченную очередь команды OpenGL аппаратным средствам (или программное обеспечение) средство рендеринга. Эти команды ставятся в очередь для выполнения в некотором конечном количестве времени, но glFlush(), не блокирует ожидание завершения команды.
glFinish(), имеет тот же эффект как glFlush(), с дополнением это glFinish(), блокирует, пока все представленные команды не были выполнены. Весь поток команды, отправленный в аппаратные средства (или программное обеспечение) средство рендеринга, как гарантируют, закончит выполнение прежде glFinish(), возвратится.
Необходимо соблюдать осторожность при использовании этих двух функций на Mac OS X вследствие асинхронной природы Сервера Окна. Визуальные аномалии могут произойти если glFlush() или glFinish(), используются неуместно, поскольку механизм обновления системы управления окнами X MacOS является асинхронным. Частично представляя сцену, сопровождаемую вызовом к glFlush() или представление ненужных точек синхронизации с glFinish(), может привести к системе управления окнами, составляющей неправильные буферные пиксели получения на экран, приводящий к мерцанию или другим визуальным аномалиям. Это происходит, потому что, когда экранное обновление необходимо, сервер окна асинхронно выберет данные от буфера спины окна.
Учитывая проект и работу Сервера Окна Mac OS X, лучше сохранять задний буфер максимально текущим с полной сценой. С тех пор glFlush() и glFinish() обработка силы команд OpenGL подчинилась, вызывание любого из них после рисования неполной сцены может привести к той сцене, представляемой в заднем буфере, с которым сервер окна может асинхронно обновить экран. Очевидно, это вызвало бы мерцание или высвечивание, поскольку частично представленная сцена нарисована на экран.
Кроме того, если glFlush() или glFinish(), вызывается, когда сервер окна должен будет обновить передний буфер, неявная подкачка будет иметь место. Это произойдет независимо от того, звонит ли приложение к его буферной функции свопинга (aglSwapBuffer() в Углероде, -flushBuffer в Какао или cglFlushDrawable() в CGL). В NSOpenGL и CGL, термин «сброс» фактически относится к буферной подкачке и не просто a glFlush().
Как правило для двойных буферизированных контекстов, текущий буфер команд OpenGL не будет отправлен в графический процессор до glFlush() или glFinish(), вызывается, буферную подкачку требуют, или буфер команд полон. Это также применяется к единственным буферизированным контекстам, несмотря на то, что выполнение буферной подкачки является действительно просто неявным glFlush() для представления потока команды аппаратным средствам. Это означает это glFlush() и glFinish() команды эквивалентны подкачке, так как весь рендеринг имеет место непосредственно в переднем буфере. Для ссылки сам буфер команд приблизительно 500k в размере и используется для вершин, normals, координат текстуры, и т.д. но не самих текстур, которые сохранены «из строки».
В целом большинство приложений не должно будет использовать glFlush() или glFinish() для выполнения нормальной задачи получения данных изображения на экран. Однако существует несколько случаев, абсолютно требующих использования glFlush() и/или glFinish() для поведения должным образом. Когда приложение OpenGL многопоточно, один такой экземпляр. Продолжить рисовать синхронизировалось через потоки, и предотвратите повреждение буфера команд, поскольку каждый поток завершает свои представления команды, это должно закончиться с вызовом к glFlush(). Другой такой экземпляр - то, где drawable изменяется во время рендеринга. Прежде чем drawable может быть успешно переключено на другого drawable, вызов должен быть выполнен, чтобы glFlush(), чтобы гарантировать, что были успешно представлены все команды, записанные в буфер команд предыдущего drawable.
История версии документа
| Дата | Примечания |
|---|---|
| 11.10.2004 | Новый документ, что объяснение различий между glFlush () и glFinish () |