2014-10-26 4 views
0

Я пытаюсь создать игру с независимой частотой кадров, в которой myObject перемещается вправо на единицу в миллисекунду. Тем не менее, я не знаю, как вычислить deltaTime в этом коде:Как правильно рассчитать временную дельта?

var currentTime = 0; 
var lastTime = 0; 
var deltaTime = 0; 

while(play) { 

    // Retrieve the current time 
    currentTime = Time.now();    
    deltaTime = currentTime - lastTime; 
    lastTime = currentTime; 

    // Move myObject at the rate of one unit per millisecond 
    myObject.x += 1 * deltaTime;  
} 

Скажем, первый кадр взял 30 мс, так deltaTime должно быть 30, но это было 0 , потому что мы знаем только время на старте кадра не в конце кадра. Затем во втором кадре потребовалось 40 мс, поэтому deltaTime равно 30, и, следовательно, myObject.x равно 30. Однако прошедшее время составляет 70 мс (30 мс в 1-м кадре + 40 мс во втором кадре), поэтому myObject.x должно быть 70, а не 30

Я не моделирую физику, я просто пытаюсь переместить myObject относительно прошедшего времени (а не кадра).

Как правильно рассчитать deltaTime?

Я знаю, что некоторые пользователи игрового движка используют кусок времени или галочку, поэтому они ожидают раньше времени. Кроме того, я уже читал article on fixing your timestep и многие другие, но я все еще смущен.

+0

На каких языках вы программируете? – APerson

+0

Это похоже на JavaScript, но это вопрос, не зависящий от языка –

+0

@APerson Я пытаюсь изучить концепцию сэр. Я не беспокоюсь о любом языке так долго, пока не собрал его – user3578021

ответ

1

Попробуйте это:

float LOW_LIMIT = 0.0167f;   // Keep At/Below 60fps 
float HIGH_LIMIT = 0.1f;   // Keep At/Above 10fps 

float lastTime = Time.now(); 

while(play) { 

    float currentTime = Time.now(); 
    float deltaTime = (currentTime - lastTime)/1000.0f; 
    if (deltaTime < LOW_LIMIT) 
     deltaTime = LOW_LIMIT; 
    else if (deltaTime > HIGH_LIMIT) 
     deltaTime = HIGH_LIMIT; 

    lastTime = currentTime; 

    myObject.x += 1000 * deltaTime;  // equivalent to one unit per ms (ie. 1000 per s) 
} 

Существует много плохого, но это делает его легче проиллюстрировать основную концепцию.

Во-первых, обратите внимание, что вам нужно инициализировать lastTime с некоторым значением ДО начала цикла. Вы можете использовать более низкое значение (т. Е. Time.now() - 33), чтобы первый кадр дал желаемую дельта или просто использовал ее так же, как и я (вы увидите, что мы ограничиваем ее в цикле).

Затем вы получаете текущее время в начале каждого разворота, используйте его для расчета времени, прошедшего с момента последнего цикла (который будет равен нулю при первом запуске этого элемента). Затем мне нравится конвертировать его в секунд, потому что имеет смысл работать «в секунду», чем «за миллисекунду», но не стесняйтесь удалить часть / 1000.0f, чтобы сохранить ее в мс.

Затем вам необходимо ограничить deltaTime до некоторого диапазона использования (для примера я использовал 10-60 кадров в секунду, но вы можете изменить это при необходимости). Это просто препятствует запуску цикла слишком быстро или слишком медленно. HIGH_LIMIT особенно важен, потому что он предотвратит очень большие значения дельта, которые могут вызвать хаос в игровом цикле (лучше быть несколько неточным, чем разбить код). LOW_LIMIT предотвращает ноль (или очень малые) временные шаги, которые могут быть одинаково проблематичным (особенно для физики).

Наконец, как только вы рассчитали новый deltaTime для этого кадра, вы сохраняете текущее время для использования в следующем кадре.

+0

спасибо, сэр .. извиниться за опоздание .. я думаю, что здесь не будет 1 .. с использованием переменной low_limit & high_limit дайте мне идею .. в строке if (deltaTime user3578021

+0

Рад помочь :) – free3dom

Смежные вопросы