OpenGL - «сверхгладкая» анимация простого горизонтально движущегося объекта

Я просто хочу сделать простую анимацию (например, в C ++ с использованием OpenGL) некоторого движущегося объекта - скажем, простое горизонтальное перемещение квадрата слева направо.

В OpenGL я могу использовать метод «двойной буферизации» и, допустим, пользователь (запускающий мое приложение с анимацией) включил «вертикальную синхронизацию», поэтому я могу вызывать какую-либо функцию каждый раз, когда монитор обновляется (я можно добиться этого, например, с помощью инструментария Qt и его функции swapBuffers).

Я думаю, что «самая плавная» анимация, которую я могу достичь, - это «переместить квадрат, например, на 1 пиксель (могут быть другие значения. ) каждый раз, когда монитор обновляется », поэтому в каждом« кадре »квадрат смещается на 1 пиксель дальше -« Я ПРОВЕРИЛ ЭТО, И ОНА УДОВЛЕТВОРЕННО РАБОТАЕТ ПЛОХО ».

Но проблема возникает, когда я хочу иметь« отдельный »поток для «игровая логика» (перемещение квадрата на 1 пиксель вправо) и «анимация» (отображение текущего положения квадрата на экране).Потому что, допустим, поток игровой логики представляет собой цикл while, в котором я перемещаю квадрат на 1 пиксель, а затем «засыпаю» поток на некоторое время, например 10 миллисекунд, а мой монитор обновляется, например, каждые 16 миллисекунд - движение квадрата «не будет на 100% гладким», потому что иногда монитор обновляется два раза, когда квадрат перемещается только на 1 пиксель, а не на 2 пикселя (потому что есть две «разные» частоты монитора и потока логики игры) - и движение будет выглядеть "немного отрывисто".

Итак, логически я мог бы остаться с первым суперплавным методом, но его нельзя использовать, например, в "многопользовательских" (например, "сервер-клиент") играх - потому что разные компьютеры имеют разные частоты мониторов (так что я должны использовать разные потоки для игровой логики (на сервере) и для анимации (на клиентах)).

Мой вопрос: Есть ли какой-нибудь метод, использующий разные потоки для игровой логики и анимации, которые делают «100% плавную» анимацию какого-то движущегося объекта, и если таковой существует, опишите его здесь, или когда у меня просто была «более сложная сцена для рендеринга», Я просто не увидел бы того "небольшого рывка", которое я вижу сейчас, когда перемещаю какой-нибудь простой квадрат по горизонтали и глубоко на нем концентрируюсь :)?

7
задан Peter Sivák 22 February 2012 в 21:46
поделиться