В чем смысл «дельты» в этом коде? Отражает ли это стандартную вещь в игровом устройстве?

24

Я очень мало знаю о программировании игр, но хотел бы узнать больше. Я пытаюсь понять код для этой игры. Я пытаюсь понять, почему код передает «delta» в Shipcontrols.js, который меняет направление движения корабля на основе пользовательского ввода.

В основном игра рассчитывает «дельту» каждого цикла ...

Вот сокращенная версия стека, который использует дельта через один цикл ...

var delta = now - this.time;
this.time = now;
this.current.render.call(this.current, delta, this.renderer);  

Шаги в здесь ...

ctx.manager.add("game", scene, camera, function(delta, renderer)
{
if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++;
var dt = delta/16.6;
this.objects.components.shipControls.update(dt); 

Шаги в здесь ...

bkcore.hexgl.ShipControls.prototype.update = function(dt)
{
var pitchAng;
var yaw;
var roll;
if (undefined != hand){ 

Что делает такие вещи ...

if(this.key.forward)
    this.speed += this.thrust * dt;
else

и это...

if(this.key.right)
{
    angularAmount -= this.angularSpeed * dt;

Какой смысл в дельте здесь? Это просто пытается ввести элемент случайности? Код для этой игры очень хорош. Почему этот парень использовал дельту?

bernie2436
источник
2
"Это просто пытается ввести элемент случайности?" На самом деле все наоборот, цель дельты здесь - уменьшить случайность и нормализовать физику в игровом движке.
zzzzBov

Ответы:

27

Это «дельта времени». Это сколько времени прошло с момента предыдущего обновления. Необходимо убедиться, что анимация, физика и т. Д. Работают с правильной скоростью.

Код выполняется один раз за обновление кадра. Тем не менее, нет гарантии, что кадры отрисовываются с постоянной скоростью. Один кадр может занимать 1/60 секунды, а следующий - 1/30. Если вы не измеряете и не учитываете это, игра будет нервной и будет работать слишком быстро или слишком медленно в различных обстоятельствах.

Дельты времени часто применяются в физике, поскольку именно так определяются уравнения для простых интегрирований Эйлера. Интегрирование скорости в положение определяется как x1 = x0 + v * (t1 - t0)упрощение в виде кода x += v * dt. Следовательно, для оценки обновлений физики необходимы дельты времени.

Очень и очень нормально измерять и применять дельты времени.

Шон Миддледич
источник
Я думаю, что это лучший ответ, потому что он объясняет, что «dt» может сильно различаться, поэтому мы должны интерполировать физические расчеты с ним.
BiAiB
Возможно, стоит отметить, что основная проблема с временными дельтами в некоторых контекстах заключается в том, что во многих случаях они будут «выключены» кадром. Если что-то приводит к тому, что обновление одного кадра занимает вдвое больше обычного времени, дельта, применяемая при вычислении действий этого кадра, будет обычной, даже если кадр не будет отображаться до тех пор, пока не будет показано, что объекты должны перемещаться вдвое дальше. как они и сделали. Если время между этим и следующим кадрами меньше обычного (может произойти, если таймер попытается «догнать», два кадра с меньшим, чем обычно, временем между ними покажут ...
суперкат
... большее, чем обычно, расстояние между позициями объекта).
суперкат
@supercat: Это просто обычный материал Fix Your Timestep . Тем не менее, вам все еще нужны дельта времени для каждого кадра, чтобы знать, когда выполнять фиксированную симуляцию.
Шон Мидлдич
@SeanMiddleditch: Как кто-то, кто кодировал игры для Atari 2600, я нахожу в некотором роде любопытным, что никто не оплакивает тот факт, что в современных системах существует неизбежная задержка между тем, когда игрок перемещает контроллер, и тем, когда персонаж реагирует. Во многих играх Atari 2600 элемент управления опрашивается каждые 16,7 мс, а обновления игрока происходят в течение 1-16 мс (в зависимости от вертикального положения); современное оборудование не способно так быстро реагировать.
суперкат
32

«Дельта», «d» или «Δ» означает «разница» в математическом контексте . Всякий раз, когда есть разница между двумя числами с похожими значениями, эту разницу можно назвать «дельта» или «d».

Дельты очень распространены в разработке игр. Например, разницу между X-координатой персонажа секунду назад и его X-координатой теперь можно назвать «delta x», и обычно она обозначается как dx, delta_xили d_x.

Кроме того, очень часто разница между двумя значениями, как в вашем коде:

var delta = now - this.time;

В этом случае эта переменная обозначает разницу между временем, сохраненным в this.time, и временем, сохраненным в now.

Дельты обычно используются для представления изменений чего-либо во времени. Например, если вы знаете, что координата X игрока должна меняться на 5 пикселей каждый кадр, вы можете сохранить это изменение как дельту:

var delta_x = 5

А затем используйте эту дельту, чтобы применить изменения, когда вам это нужно:

player.x = player.x + delta_x

Но помните, что это всего лишь соглашение. Никто не заставляет вас называть ваши переменные «delta» или «d», но это может помочь кому-то еще, кто читает ваш код, или вам самим, если вы будете читать его в будущем, чтобы понять, что переменная должна делать.

Другие распространенные греческие буквы, широко используемые в программировании:

Эпсилон : за очень маленькое значение. Обычно используется при сравнении с плавающей запятой или других переменных с проблемами точности:

const epsilon = 0.0001
...
if abs(some_float - other_float) < epsilon then
    -- close enough, let's say they're equal
end

Пи : для одноименной константы

Тета : для представления углов

Лямбда : для представления анонимных функций или замыканий

Панда Пижама
источник
1
Вы также увидите некоторые кратные π, такие как 2π, π / 2, π / 4 и e (постоянная Эйлера).
JZX
@Thomas: Конечно, любая программа с математической базой внесет теоретические обозначения в код. Обратите внимание на предложение «Другие распространенные греческие буквы, широко используемые в программировании». « некоторый графический код» вряд ли можно квалифицировать как «обычный» или «широко используемый». Я никогда не утверждал, что это единственные греческие буквы, которые можно использовать, и что это единственное значение, которое вы можете установить для этих греческих букв.
Панда Пижама
@yzx: В прошлый раз, когда я проверял, константа Эйлера использовала латинскую букву «е». Я говорил не о математических константах, которые появляются в коде, а о греческих буквах, обычно используемых в коде.
Панда Пижама
@PandaPajama Я удалил свой комментарий, так как он не приветствуется.
Томас
3
Если ваши товарищи особенно модные, вы можете даже увидеть Тау (τ) вместо 2π.
Каз Дракон
3

dtобозначает delta time. Он используется при расчете частоты кадров, чтобы гарантировать, что игра работает с одинаковой скоростью независимо от частоты кадров.

Более подробную информацию о framerate independenceможно найти здесь .

реанимация
источник
3

dt (дельта-время) - это время между каждым циклом / кадром рендеринга (или любой временной отметкой, которую вы хотите) вашего цикла. С этим дельта-временем мы можем растянуть определенные значения во времени. Как и в реальном мире, мы измеряем определенные физические свойства с течением времени.

Допустим, мы запускаем нашу игру со скоростью 60 кадров в секунду. Если мы хотим, чтобы наш проигрыватель двигался со скоростью 5 пикселей в секунду, мы делаем

 5 * (1/60); //Assuming we have a stable delta time of 0.016
 // (1/60) = 0.016 || 0.016 * 5 =  0.083 --> moved per frame || 60 frames * 0.083 = 5

или

 5 * (newTime - oldTime); //aka dt

Персонаж перемещается на 5 пикселей за 60 кадров. Чем дольше ваш цикл занимает большее время дельта получит.

Для каждой частоты кадров (1/30, 1/25 и т. Д.) Результат будет одинаковым.

Sidar
источник