Verständnis delta

Kenan89

Bekanntes Mitglied
Hallo,

ich habe ein Problem.
Folgendes:
Wenn ich ein Objekt bewege, wird ein Zähler hochgezählt. Wenn dieser Zähler einen Wert erreicht hat, dann erfolgt die nächste Animationsstufe.
So, da jetzt jeder PC anders schnell ist, wird die update Methode, wo unter anderem auch der Zähler hochgezählt wird, unterschiedlich oft die Sekunde aufgerufen.
Um die unterschiedliche Anzahl der Aufrufe auszugleichen, gibt es ja delta. Jetzt mache ich es so, dass ich immer wenn der Zähler + 1 genommen wird, ich noch das Ergebnis mit delta multipliziere:
zähler = zähler + 1 * delta

Ich habe delta auch ausgeben lassen und es zeigt mir die Werte an wie 1, 2, 3. Sollte er nicht viel niedriger sein? Meine FPS sind ca 700 pro Sekunde.

Auf Tutorials wird gesagt, man soll delta immer bei berechnungen einbeziehen, die vom Anzahl der Aufrufe der update methode abhängig sind.

Was habe ich falsch verstanden?

EDIT: So, ich hoffe, ich habe es richtig:
zähler += 0.1 * delta;
In dieser Form sollte doch jede von update Abhängige Berechnung erfolgen?
 
Zuletzt bearbeitet:

Fu3L

Top Contributor
In deinem Edit steht nichts anderes als was im ersten steht, mit Ausnahme, dass es 10 mal langsamer ist.

Was stört dich denn an 1 oder 2? Wenn delta 2 ms ist, dann ist deine Framerate 500, ist delta 1 ist deine Framerate 1000.
 
N

nillehammer

Gast
Kenan89 hat gesagt.:
Jetzt mache ich es so, dass ich immer wenn der Zähler + 1 genommen wird, ich noch das Ergebnis mit delta multipliziere:
Zitat:
zähler = zähler + 1 * delta
Das, was Du schreibst, und das was Deine Formeln machen, ist nicht daselbe. Du schreibst, dass Du das Ergebnis nach dem Hochzählen mit delta multiplizeren willst. Wegen der nicht beachteten Regel "Punkt vor Strich" (ich glaub Mathe 6. Klasse, kann man schon mal vergessen:D), addierst Du aber tatsächlich immer delta, anstatt zähler damit zu multiplizieren. Du musst die Addition in Klammern setzen.

P.S. Ich weiß jetzt zwar überhaupt nicht, wo delta herkommt. Vielleicht ist der Name so vorgegeben, aber glücklich ist er nicht, sowas wie correctionFactor o.ä. wäre sicher besser.
 
N

nillehammer

Gast
ne er soll erst die zahl, die aufsummiert wird mit delta multiplizieren
Andere Umschreibung für Deinen ersten Text...

Aber genau das machst Du nicht. Du multiplizierst im ersten Fall delta mit 1 und im Zweiten mit 0.1 und das Ergebnis dieser Multiplikation addierst Du dann dazu. Damit Du erst eine Addition machst und dann das delta dazu multiplizierst, muss die Addition in Klammern.
 
Zuletzt bearbeitet von einem Moderator:

Fu3L

Top Contributor
Nee, ich denke Kenan macht das schon richtig. Man will ja nicht den Zähler immer zB *2 nehmen (wenn delta 2 wäre), sondern man will das zu Addierende verändern je nach vergangener Zeit. Zum Beispiel 1 px/ms * delta [gemessen in ms]
 
S

Spacerat

Gast
Wie berechnest du denn delta auf den verschiedenen Rechnern? Hoffentlich mit "System.nanoTime()". "System.currentTimeMillis()" könnte nämlich bereits bei 10 Jahre alten Rechnern schon viel zu ungenau sein bzw. überhaupt nicht anschlagen.
Andernfalls könnten Fehler auch daraus resultieren, dass delta bereits in Sekunden umgerechnet wurde und deswegen eine Fliesskommazahl zwischen 0 und 1 ist. In diesem Fall addierst du zum Zähler immer 0, wenn dieser ein Integerformat hat.
 

Kenan89

Bekanntes Mitglied
Andere Umschreibung für Deinen ersten Text...

Aber genau das machst Du nicht. Du multiplizierst im ersten Fall delta mit 1 und im Zweiten mit 0.1 und das Ergebnis dieser Multiplikation addierst Du dann dazu. Damit Du erst eine Addition machst und dann das delta dazu multiplizierst, muss die Addition in Klammern.

Er soll die Zahl, die aufsummiert wird, mit delta multiplizieren. Die Zahl die aufsummiert wird wäre die 1, oder die 0.1.

Spacerat hat gesagt.:
Wie berechnest du denn delta auf den verschiedenen Rechnern? Hoffentlich mit "System.nanoTime()". "System.currentTimeMillis()" könnte nämlich bereits bei 10 Jahre alten Rechnern schon viel zu ungenau sein bzw. überhaupt nicht anschlagen.
Andernfalls könnten Fehler auch daraus resultieren, dass delta bereits in Sekunden umgerechnet wurde und deswegen eine Fliesskommazahl zwischen 0 und 1 ist. In diesem Fall addierst du zum Zähler immer 0, wenn dieser ein Integerformat hat.

Das macht Slick automatisch für mich. In der update Methode kann man auf delta zugreifen.
 
S

Spacerat

Gast
Na herzlichen Glückwunsch... lässt sich wenigstens nachvollziehen, ob Delta nun Nano-, Micro-, Milli- oder Sekunden sind?
Für deine Aufsummierzeile verwendest du in allen Fällen hoffentlich bereits Fliesskommavariablen... sonst müsste ich Fragen, was an "delta" eigentlich so unverständlich ist. Es ist schlicht und ergreifend der gemessene Zeitabstand zwischen zwei definierten Ereignissen z.B. gerenderten Frames. Natürlich muss dieser Wert auch eine klar definierte Zeiteinheit führen. Tut er dieses nicht, berechne ihn dir lieber selber.
 

Fu3L

Top Contributor
Delta ist gemessen in Millisekunden (habs tatsächlich jetzt gegoogelt, um meine Vermutung zu bestätigen).
Floats als Ortskoordinaten sind natürlich "Pflicht".
Wäre aber bei der Berechnung oben zähler ein int, wärs net schlimm, weil delta auch eins ist.

sonst müsste ich Fragen, was an "delta" eigentlich so unverständlich ist.

Das frage ich mich auch schon länger. Aber es gibt wohl immer irgendwas was man mal nicht sofort versteht^^
 

Ähnliche Java Themen

Neue Themen


Oben