Jaki jest sens „delta” w tym kodzie? Czy odzwierciedla to standardową rzecz w grze deweloperów?


24

Bardzo mało wiem o programowaniu gier, ale chciałbym dowiedzieć się więcej. Próbuję zrozumieć kod tej gry. Próbuję zrozumieć, dlaczego kod przekazuje „deltę” do Shipcontrols.js, która zmienia kierunek statku na podstawie danych wprowadzonych przez użytkownika.

Zasadniczo gra oblicza „deltę” w każdej pętli ...

Oto skrócona wersja stosu, która wykorzystuje deltę przez jedną pętlę ...

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

Wchodzi tutaj ...

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); 

Wchodzi tutaj ...

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

Co robi takie rzeczy ...

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

i to...

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

Jaki jest sens delty tutaj? Czy to tylko próba wprowadzenia elementu losowości? Kod tej gry jest bardzo dobry. Dlaczego ten facet użył delty?


2
„Czy to tylko próba wprowadzenia elementu losowości?” W rzeczywistości jest dokładnie odwrotnie, celem delty tutaj jest zmniejszenie losowości i normalizacja fizyki w silniku gry.
zzzzBov,

Odpowiedzi:


27

To jest „delta czasu”. To ile czasu minęło od poprzedniej aktualizacji. Konieczne jest upewnienie się, że animacje, fizyka itd. Działają z odpowiednią prędkością.

Kod jest uruchamiany raz na aktualizację ramki. Nie ma jednak gwarancji, że ramki są rysowane ze stałą prędkością. Jedna klatka może zająć 1/60 sekundy, a następna 1/30. Jeśli nie zmierzysz tego i nie weźmiesz pod uwagę, gra będzie roztrzęsiona i będzie działać albo zbyt szybko, albo zbyt wolno w różnych okolicznościach.

Delty czasowe są często stosowane w fizyce, ponieważ w ten sposób określane są równania dla prostych integracji Eulera. Zintegrowanie prędkości z pozycją jest zdefiniowane jako x1 = x0 + v * (t1 - t0)upraszczające kod x += v * dt. Dlatego do oceny aktualizacji fizyki wymagane są delty czasowe.

To bardzo, bardzo normalne, aby mierzyć i stosować delty czasowe.


Myślę, że to najlepsza odpowiedź, ponieważ wyjaśnia, że ​​„dt” może się bardzo różnić, dlatego musimy interpolować z nim obliczenia fizyki.
BiAiB,

Warto zauważyć, że głównym problemem związanym z deltami czasowymi w niektórych kontekstach jest to, że w wielu przypadkach będą one „wyłączane” przez ramkę. Jeśli coś powoduje, że aktualizacja jednej klatki trwa dwa razy dłużej niż zwykle, delta zastosowana podczas obliczania działań tej klatki będzie normalna, nawet jeśli klatka nie zostanie wyświetlona, ​​dopóki obiekty nie powinny zostać pokazane, aby przesunęły się dwa razy tak daleko tak jak oni. Jeśli czas między tą klatką a następną jest mniejszy niż zwykle (może wystąpić, jeśli licznik czasu próbuje „nadrobić zaległości”, dwie klatki z mniejszą
ilością

... większa niż zwykle odległość między pozycjami obiektu).
supercat,

@ superupat: To tylko zwykłe rzeczy Fix Your Timestep . Nadal jednak potrzebujesz delta czasu na klatkę, aby wiedzieć, kiedy wykonać stałą symulację.
Sean Middleditch,

@SeanMiddleditch: Jako ktoś, kto kodował gry dla Atari 2600, pod pewnymi względami ciekawi mnie to, że nikt nie ubolewał nad tym, że w nowoczesnych systemach istnieje nieuniknione opóźnienie między momentem, w którym gracz porusza kontrolerem, a odpowiedzią postaci. W wielu grach Atari 2600 kontrola jest sprawdzana co 16,7 ms, a aktualizacje odtwarzacza następują w ciągu 1-16 ms (w zależności od pozycji pionowej); nowoczesny sprzęt nie jest w stanie tak szybko zareagować.
supercat,

32

„Delta”, „d” lub „Δ” oznacza „różnicę” w kontekście matematycznym . Ilekroć występuje różnica między dwiema liczbami o podobnych znaczeniach, różnicę tę można nazwać „deltą” lub „d”.

Delty są bardzo powszechne w tworzeniu gier. Na przykład, różnica między znakiem X jest współrzędną jedną sekundą a jego współrzędnej x można teraz nazywana „PPO” i jest powszechnie określane jako dx, delta_xlub d_x.

Często zdarza się, że różnica występuje dwa razy, tak jak w kodzie:

var delta = now - this.time;

W tym przypadku ta zmienna oznacza różnicę między czasem przechowywanym w this.time, a czasem przechowywanym w now.

Delty są powszechnie używane do przedstawienia zmiany czegoś w czasie. Na przykład, jeśli wiesz, że współrzędna X gracza powinna zmieniać 5 pikseli w każdej klatce, możesz zapisać tę zmianę jako różnicę:

var delta_x = 5

A następnie użyj tej delty, aby zastosować zmianę, gdy jej potrzebujesz:

player.x = player.x + delta_x

Pamiętaj jednak, że to tylko konwencja. Nikt nie zmusza cię do nazwania twoich zmiennych „delta” lub „d”, ale może to pomóc komuś, kto czyta twój kod, lub tobie, jeśli przeczytasz go w przyszłości, w zrozumieniu, co ma robić zmienna.

Inne popularne litery greckie szeroko stosowane w programowaniu to:

Epsilon : za bardzo małą wartość. Często używane podczas porównywania zmiennoprzecinkowych lub innych zmiennych z problemami z precyzją:

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

Pi : dla stałej tytułowej

Theta : do reprezentowania kątów

Lambda : do reprezentowania anonimowych funkcji lub zamknięć


1
Zobaczysz także pewne wielokrotności π, takie jak 2π, π / 2, π / 4 i e (stała Eulera).
jzx

@Thomas: Jasne, każdy program oparty na matematyce wprowadzi zapis teoretyczny do kodu. Zwróć uwagę na zdanie „Inne popularne greckie litery szeroko stosowane w programowaniu to”. „ niektóre kody graficzne” prawie nie kwalifikują się jako „powszechne” lub „powszechnie używane”. Nigdy nie twierdziłem, że są to jedyne greckie litery, których można użyć, ani że są to jedyne znaczenia, jakie można ustawić dla tych greckich liter.
Panda Pajama,

@yzx: Kiedy ostatnio sprawdzałem, stała Eulera używała łacińskiej litery „e”. Nie mówiłem o stałych matematycznych pojawiających się w kodzie, ale o greckich literach powszechnie używanych w kodzie.
Panda Pajama,

@PandaPajama Usunąłem swój komentarz, ponieważ nie jest mile widziany.
Thomas,

3
Jeśli twoi towarzysze są szczególnie modni, możesz nawet zobaczyć Tau (τ) zamiast 2π.
Kaz Dragon,

3

dtoznacza delta time. Służy do obliczania liczby klatek na sekundę, aby zapewnić, że gra działa z tą samą prędkością, bez względu na częstotliwość klatek.

Więcej informacji na framerate independenceten temat można znaleźć tutaj .


3

dt (czas delta) to czas między każdym cyklem renderowania (lub dowolnym znacznikiem czasu) pętli. Dzięki temu czasowi delty możemy rozciągać określone wartości w czasie. Podobnie jak w prawdziwym świecie, mierzymy pewne właściwości fizyki w czasie.

Powiedzmy, że uruchamiamy naszą grę 60 klatek na sekundę. Jeśli chcemy, aby nasz odtwarzacz poruszał się o 5 pikseli na sekundę, robimy to

 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

lub

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

Postać porusza się o 5 pikseli na 60 klatkach. Im dłużej trwa cykl, tym większy będzie czas delty.

Dla każdej liczby klatek na sekundę (1/30, 1/25 itd.) Wynik będzie taki sam.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.