Який сенс "дельта" у цьому коді? Чи відображає це стандартна річ у ігровому розробнику?


24

Я дуже мало знаю про програмування ігор, але хотів би дізнатися більше. Я намагаюся зрозуміти код цієї гри. Я намагаюся зрозуміти, чому код передає "дельту" 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;

Який сенс дельти тут? Чи просто намагається ввести елемент випадковості? Код цієї гри дуже хороший. Чому цей хлопець використовував дельту?


2
"Це просто намагається ввести елемент випадковості?" Насправді все навпаки, мета дельти тут - зменшити випадковість і нормалізувати фізику в ігровому двигуні.
zzzzBov

Відповіді:


27

Це "дельта часу". Скільки часу минуло від попереднього оновлення. Потрібно забезпечити правильну роботу анімації, фізики тощо.

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

Часові дельти часто застосовуються у фізиці, оскільки саме так задаються рівняння для простих інтеграцій Ейлера. Інтегрування швидкості в положення визначається таким, x1 = x0 + v * (t1 - t0)що спрощує в подібний код x += v * dt. Отже, потрібні дельти часу для оцінки оновлень фізики.

Це дуже, дуже нормально, щоб вимірювати та застосовувати дельти часу.


Я думаю, що це найкраща відповідь, тому що пояснення "dt" може сильно відрізнятися, тому нам потрібно інтерполювати обчислення фізики.
BiAiB

Можливо, варто відзначити, що головна проблема з часовими дельтами в деяких контекстах полягає в тому, що в багатьох випадках вони будуть "вимкнено" кадром. Якщо щось спричиняє оновлення кадру вдвічі довше звичайного, дельта, застосована при обчисленні дій цього кадру, буде звичайною, навіть незважаючи на те, що кадр не відображатиметься до того моменту, коли об’єкти повинні бути показані, перемістившись удвічі більше як вони це зробили. Якщо час між цим кадром і наступним буде меншим, ніж зазвичай (може трапитися, якщо таймер намагається "наздогнати", два кадри з меншим часом, ніж зазвичай, між ними з'являться ...
supercat

... більша, ніж зазвичай, відстань між положеннями об'єкта).
supercat

@supercat: Це лише звичайні речі, що виправляються . Вам все ще потрібні часові дельти за кадром, щоб знати, коли робити крок фіксованого моделювання.
Шон Міддлічч

@SeanMiddleditch: Як хтось, хто кодував ігри для Atari 2600, мені в чомусь цікаво, що ніхто не скаржився на те, що в сучасних системах неминучий відставання між тим, коли гравець рухає контролером, і коли персонаж відповідає. У багатьох іграх Atari 2600 контроль опитується кожні 16,7 м, а оновлення гравця відбувається протягом 1-16 мс від цього (залежно від вертикальної позиції); сучасне обладнання не здатне швидко реагувати на це.
supercat

32

"Дельта", "d" або "Δ" означає "різниця" в математичному контексті . Щоразу, коли різниця різниться між двома числами з подібними значеннями, цю різницю можна назвати "дельтою" або "d".

Дельти дуже поширені в розробці ігор. Наприклад, різниця між X-координатою символу секунди тому та його X-координатою тепер може бути названа "дельта 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: Звичайно, будь-яка програма з математичною основою внесе теоретичні позначення в код. Зверніть увагу на речення "Інші поширені грецькі букви, які широко використовуються в програмуванні". " деякий графічний код" навряд чи кваліфікується як "загальний" або "широко використовується". Я ніколи не стверджував, що це єдині грецькі букви, які можна використовувати, ні що це єдині значення, які ви можете встановити для цих грецьких букв.
Піжама Panda

@yzx: Востаннє, коли я перевіряв, константа Ейлера використовувала латинську літеру "е". Я не говорив про математичні константи, які відображаються в коді, а натомість про грецькі букви, які зазвичай використовуються в коді.
Піжама Panda

@PandaPajama Я видалив свій коментар, оскільки це не вітається.
Томас

3
Якщо ваші товариші особливо хипні, ви можете побачити навіть Tau (τ) замість 2π.
Kaz Dragon

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 тощо) результат буде однаковим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.