Was ist der Sinn von "Delta" in diesem Code? Entspricht es einem Standard bei Spielentwicklern?

24

Ich weiß sehr wenig über Spieleprogrammierung, würde aber gerne mehr erfahren. Ich versuche den Code für dieses Spiel zu verstehen . Ich versuche zu verstehen, warum der Code ein "Delta" an Shipcontrols.js übergibt, das die Richtung des Schiffes basierend auf Benutzereingaben ändert.

Grundsätzlich berechnet das Spiel "Delta" jede Schleife ...

Hier ist eine abgekürzte Version des Stapels, die Delta durch eine Schleife verwendet ...

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

Schritte in hier ...

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

Schritte in hier ...

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

Was macht sowas ...

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

und das...

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

Was ist der Punkt des Deltas hier? Versucht es nur, ein Element der Zufälligkeit einzuführen? Der Code für dieses Spiel ist sehr gut. Warum hat dieser Typ Delta benutzt?

bernie2436
quelle
2
"Versucht es nur, ein Element der Zufälligkeit einzuführen?" Tatsächlich ist das genaue Gegenteil der Fall, der Zweck des Deltas besteht hier darin, die Zufälligkeit zu verringern und die Physik in der Spiel-Engine zu normalisieren.
zzzzBov

Antworten:

27

Dies ist das "Zeitdelta". Es ist, wie viel Zeit seit dem letzten Update vergangen ist. Es muss sichergestellt werden, dass Animationen, Physik usw. mit der richtigen Geschwindigkeit ausgeführt werden.

Der Code wird einmal pro Frame-Update ausgeführt. Es gibt jedoch keine Garantie dafür, dass Frames mit einer konstanten Geschwindigkeit gezeichnet werden. Ein Bild kann 1/60 einer Sekunde und das nächste 1/30 einer Sekunde dauern. Wenn Sie dies nicht messen und berücksichtigen, wird das Spiel nervös und läuft unter verschiedenen Umständen entweder zu schnell oder zu langsam.

Zeitdeltas werden in der Physik häufig angewendet, da die Gleichungen für einfache Euler-Integrationen so angegeben werden. Das Integrieren der Geschwindigkeit in die Position ist definiert als, x1 = x0 + v * (t1 - t0)was sich wie in Code vereinfacht x += v * dt. Daher sind Zeitdeltas erforderlich, um physikalische Aktualisierungen zu bewerten.

Es ist sehr, sehr normal, dass Zeitdeltas gemessen und angewendet werden.

Sean Middleditch
quelle
Ich denke, dies ist die beste Antwort, da es erklärt, dass 'dt' sehr unterschiedlich sein kann, weshalb wir damit physikalische Berechnungen interpolieren müssen.
BiAiB
Es kann erwähnenswert sein, dass ein Hauptproblem bei Zeitdeltas in einigen Zusammenhängen darin besteht, dass sie in vielen Fällen um einen Frame "aus" sind. Wenn ein Frame doppelt so lange wie gewöhnlich aktualisiert wird, ist das Delta, das bei der Berechnung der Aktionen dieses Frames angewendet wird, das Übliche, auch wenn der Frame erst angezeigt wird, wenn Objekte angezeigt werden sollen, die sich doppelt so weit bewegt haben wie sie es taten. Wenn die Zeit zwischen diesem und dem nächsten Frame kürzer ist als üblich (kann auftreten, wenn der Timer versucht, "aufzuholen", werden die beiden Frames mit weniger Zeit als üblich zwischen ihnen
angezeigt
... ein größerer Abstand als üblich zwischen den Objektpositionen).
Supercat
@supercat: Das ist nur das übliche Fix Your Timestep- Zeug. Sie benötigen jedoch weiterhin Zeitdeltas pro Frame, um zu wissen, wann eine feste Simulation durchgeführt werden muss.
Sean Middleditch
@SeanMiddleditch: Als jemand, der Spiele für den Atari 2600 programmiert hat, finde ich es in gewisser Weise merkwürdig, dass niemand die Tatsache beklagt, dass es auf modernen Systemen eine unvermeidbare Verzögerung gibt, wenn der Spieler einen Controller bewegt und der Charakter reagiert. Bei vielen Atari 2600-Spielen wird die Steuerung alle 16,7 ms abgefragt und die Spieleraktualisierungen erfolgen innerhalb von 1 bis 16 ms (abhängig von der vertikalen Position). moderne Geräte sind nicht in der Lage, so schnell zu reagieren.
Supercat
32

"Delta", "d" oder "Δ" bedeutet "Differenz" in einem mathematischen Kontext . Wenn zwischen zwei Zahlen mit ähnlicher Bedeutung ein Unterschied besteht, kann dieser Unterschied als "Delta" oder "d" bezeichnet werden.

Deltas sind in der Spieleentwicklung sehr verbreitet. Zum Beispiel kann man der Unterschied zwischen dem Charakter eines X-Koordinate zweiten vor und seine X-Koordinaten kann nun „delta x“, und wird allgemein bezeichnet als bezeichnet werden dx, delta_xoder d_x.

Es ist auch sehr häufig, dass der Unterschied zwischen zwei Zeiten besteht, wie in Ihrem Code:

var delta = now - this.time;

In diesem Fall gibt diese Variable die Differenz zwischen der in gespeicherten Zeit this.timeund der in gespeicherten Zeit an now.

Deltas werden üblicherweise verwendet, um die zeitliche Veränderung von etwas darzustellen. Wenn Sie beispielsweise wissen, dass sich die X-Koordinate eines Spielers in jedem Frame um 5 Pixel ändern sollte, können Sie diese Änderung als Delta speichern:

var delta_x = 5

Verwenden Sie dieses Delta, um die Änderung bei Bedarf anzuwenden:

player.x = player.x + delta_x

Aber denken Sie daran, dass dies nur eine Konvention ist. Niemand zwingt Sie dazu, Ihre Variablen "delta" oder "d" zu nennen, aber dies kann jemand anderem helfen, der Ihren Code liest, oder sich selbst, wenn Sie ihn in Zukunft lesen, um zu verstehen, was die Variable tun soll.

Andere gebräuchliche griechische Buchstaben, die in der Programmierung häufig verwendet werden, sind:

Epsilon : für einen sehr kleinen Wert. Wird häufig beim Vergleichen von Gleitkommazahlen oder anderen Variablen mit Genauigkeitsproblemen verwendet:

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

Pi : für die namensgebende Konstante

Theta : zur Darstellung von Winkeln

Lambda : zur Darstellung anonymer Funktionen oder Schließungen

Panda-Pyjama
quelle
1
Sie sehen auch bestimmte Vielfache von π, wie 2π, π / 2, π / 4 und e (Euler-Konstante).
JZX
@Thomas: Sicher, jedes Programm mit mathematischer Basis bringt die theoretische Notation in den Code. Beachten Sie den Satz "Andere häufig in der Programmierung verwendete griechische Buchstaben sind". " Einige Grafikcodes" werden kaum als "häufig" oder "weit verbreitet" eingestuft. Ich habe nie behauptet, dass dies die einzigen griechischen Buchstaben sind, die verwendet werden können, noch dass dies die einzigen Bedeutungen sind, die Sie für diese griechischen Buchstaben festlegen können.
Panda Pyjama
@yzx: Als ich das letzte Mal nachgesehen habe, hat Eulers Konstante den lateinischen Buchstaben "e" verwendet. Ich habe nicht über mathematische Konstanten gesprochen, die im Code vorkommen, sondern über griechische Buchstaben, die im Code häufig verwendet werden.
Panda Pyjama
@PandaPyjama Ich habe meinen Kommentar gelöscht, da er nicht erwünscht ist.
Thomas
3
Wenn Ihre Kameraden besonders hip sind, sehen Sie möglicherweise sogar Tau (τ) anstelle von 2π.
Kaz Dragon
3

dtsteht für delta time. Es wird bei der Berechnung der Bildrate verwendet, um sicherzustellen, dass das Spiel unabhängig von der Bildrate mit derselben Geschwindigkeit läuft.

Weitere Informationen zu framerate independencefinden Sie hier .

Reanimation
quelle
3

dt (Delta-Zeit) ist die Zeit zwischen jedem Zyklus / Render-Frame (oder einem beliebigen Zeitstempel) Ihrer Schleife. Mit dieser Deltazeit können wir bestimmte Werte über die Zeit strecken. Genau wie in der realen Welt messen wir bestimmte physikalische Eigenschaften über die Zeit.

Nehmen wir an, wir starten unser Spiel mit 60 Bildern pro Sekunde. Wenn wir möchten, dass sich unser Player 5 Pixel pro Sekunde bewegt, tun wir das

 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

oder

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

Das Zeichen bewegt sich 5 Pixel über 60 Frames. Je länger Ihr Zyklus dauert, desto größer wird die Deltazeit.

Für jede Bildrate (1/30, 1/25 usw.) ist das Ergebnis dasselbe.

Sidar
quelle