# Verständnis delta



## Kenan89 (23. Mai 2012)

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?


----------



## Fu3L (23. Mai 2012)

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.


----------



## nillehammer (23. Mai 2012)

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), 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.


----------



## Kenan89 (23. Mai 2012)

haha ist schon klar. 
ne er soll erst die zahl, die aufsummiert wird mit delta multiplizieren.


----------



## nillehammer (23. Mai 2012)

> 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.


----------



## Fu3L (23. Mai 2012)

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]


----------



## Spacerat (24. Mai 2012)

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 (24. Mai 2012)

nillehammer hat gesagt.:


> 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.


----------



## Spacerat (24. Mai 2012)

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 (24. Mai 2012)

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^^


----------

