неблокирующая функция SwapBuffers () с VSync = on - PullRequest
6 голосов
/ 08 февраля 2010

Я ищу портативный способ создания неблокирующих SwapBuffers (), даже если VSync активирован.
Другими словами, возможно ли получить уведомление о событии или узнать задержку до следующего VSync?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2010

IIRC это расширение помогает: http://www.opengl.org/registry/specs/SGI/video_sync.txt,, но оно очень плохо поддерживается текущими драйверами.

0 голосов
/ 21 марта 2011

Во-первых, почему бы вам просто не вызвать SwapBuffers () в начале кадра? Или как-то изменить конвейер на

  Render();
  Update(); //Update before swapping buffers
  SwapBuffers();

Пока OpenGL работает над всеми командами, которые вы только что добавили, вы можете выполнять всю логику обновления.

В противном случае есть несколько способов решить эту проблему.

Я знаю, что у XNA есть свойство ScanLine, которое сообщает вам, какая линия сканирования находится в данный момент на экране. Я не знаю, выставляет ли OpenGL это тоже, но я почти уверен, что должен. (Верно?)

Использовать многопоточный рендеринг. Многие современные движки выделяют целый поток только для рендеринга. Если это блокирует, это хорошо, это не мешает основному потоку. Альтернативно, более простой способ - просто обрабатывать ввод и т. Д. В новом потоке, это позволяет избежать сложностей с графическим контекстом.

Использовать тройную буферизацию . Использование тройной буферизации означает, что у вас есть 2 обратных буфера. После того как вы вызовете SwapBuffers, экран может продолжить сканирование переднего буфера с ожидающим завершением буфера и третьим буфером, на который вы будете рендерить следующий кадр. Конечно, если вы уже предварительно визуализировали два кадра, SwapBuffers () заблокирует.

...