Во-первых, почему бы вам просто не вызвать SwapBuffers () в начале кадра? Или как-то изменить конвейер на
Render();
Update(); //Update before swapping buffers
SwapBuffers();
Пока OpenGL работает над всеми командами, которые вы только что добавили, вы можете выполнять всю логику обновления.
В противном случае есть несколько способов решить эту проблему.
Я знаю, что у XNA есть свойство ScanLine, которое сообщает вам, какая линия сканирования находится в данный момент на экране. Я не знаю, выставляет ли OpenGL это тоже, но я почти уверен, что должен. (Верно?)
Использовать многопоточный рендеринг. Многие современные движки выделяют целый поток только для рендеринга. Если это блокирует, это хорошо, это не мешает основному потоку. Альтернативно, более простой способ - просто обрабатывать ввод и т. Д. В новом потоке, это позволяет избежать сложностей с графическим контекстом.
Использовать тройную буферизацию . Использование тройной буферизации означает, что у вас есть 2 обратных буфера. После того как вы вызовете SwapBuffers, экран может продолжить сканирование переднего буфера с ожидающим завершением буфера и третьим буфером, на который вы будете рендерить следующий кадр. Конечно, если вы уже предварительно визуализировали два кадра, SwapBuffers () заблокирует.