Jump to content
Unity Insider Forum
Sign in to follow this  
  • entries
    5
  • comments
    9
  • views
    18,107

Ãœberraschung: AnimationCurve.Evaluate ist schneller als Mathf.Lerp!

Sign in to follow this  
jashan

555 views

Da müsste ein Link auf das ursprüngliche Forum-Posting dabei stehen ... es ging um die Frage, wie man 0, 0.5, 1.0 linear auf 0.5, 0.75, 1.0 abbilden kann. Da kam natürlich dann recht flott auch Lerp, also lineare Interpolation, was für so etwas die naheliegendste Methode ist. Ich dachte mir, dass aber Artists sicher lieber AnimationCurves verwenden, weil das anschaulicher und flexibler ist.

Um mich nicht mit einem Tip zu blamieren, der potenziell der Performance schadet, machte ich die Bemerkung:

[quote name='jashan' timestamp='1436865245' post='76067']Die Flexibilität, die dir das bietet kostet natürlich ein wenig Performance ... da müsste man mal testen, was das konkret für einen Unterschied macht.[/quote]

... und dann wollte ich's aber genau wissen. Das Ergebnis hat mich dann am Ende doch etwas überrascht (deswegen als Blog-Posting):

[i]Wenig[/i] heisst in diesem Fall wirklich [u][b]wenig[/b][/u]: Bei 10000 Iterationen dauert es in beiden Fällen noch keine ganze Millisekunde. Bei 1 Mio Iterationen habe ich bei [b]Lerp 26 ms[/b], bei der [b]AnimationCurve 28ms[/b].

Allerdings braucht die AnimationCurve eine gewisse Zeit zur Initialisierung: [b]bei einem Schleifendurchlauf[/b] habe ich bei [b]AnimationCurve 1090 Ticks[/b], bei [b]Lerp 40 Ticks[/b]. Da könnte man jetzt sagen: "Lerp ist 27 Mal schneller, auf keinen Fall AnimationCurves verwenden". Aber das gilt halt nur, wenn man es nur ein einziges Mal verwendet (und 1 Tick ist 1/10000 ms, also wenn ich's richtig im Kopf habe 0.1 ns ... also ... praktisch "keine Zeit" ;-) ).

Bei der zweiten "Runde" mit einem Durchlauf, sind es dann 0 Ticks, 0 Ticks (manchmal auch 10 Ticks, sowohl bei Curve als auch bei Lerp, also kein wirklicher Unterschied messbar).

[b]Wow, man muss so etwas wirklich sauber testen und messen:[/b] In der "Praxis" ist es dann nämlich offenbar so, dass die [b]AnimationCurve sogar schneller ist, als Lerp![/b] Damit hätte ich jetzt nicht gerechnet: Beim ersten Durchlauf mit 1 Mio Iterationen ist nach wie vor Lerp minimal schneller (Lerp 26ms, AnimationCurve 28ms). Aber bei allen Wiederholungen haben wir dann Lerp immer noch 26ms, aber AnimationCurve 24ms.

Wieder mal was gelernt ;-) ... ich kann's mir nur so erklären, dass AnimationCurve irgendetwas schlau cachet oder irgendwie anders umgesetzt wird, so dass nach einem "warmup" die Berechnung extrem schnell ist (schneller als das praktisch triviale Lerp).

Und, um auch den letzten Rest meiner Neugier zu befriedigen: Auch wenn die Kurve deutlich komplexer ist (mit zig Kontrollpunkten) hat das nur minimale Auswirkungen auf die Performance, was allerdings die Caching-Theorie (die sowieso auf Strohbeinen stand) widerlegt, weil sonst der erste Durchlauf deutlich länger dauern müsste.

[CODE]
using UnityEngine;

public class SimpleCurve : MonoBehaviour {

public AnimationCurve curve = new AnimationCurve();

public int counter = 1000000;

public float Evaluate(float t) {
return curve.Evaluate(t);
}

public void Awake() {
for (int i=0; i < 10; i++) {
TestA();
TestB();
}
}

private void TestA() {
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch ();
sw.Start();
float result = 0;
for (float i=0; i < counter; i++) {
result = curve.Evaluate(i / counter);
}
sw.Stop();
Debug.LogFormat("Using curve for {3} iterations took: {0} ms, {1} ticks, result was: {2}",
sw.ElapsedMilliseconds, sw.ElapsedTicks, result, counter);
}

private void TestB() {
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch ();
sw.Start();
float result = 0;
for (float i=0; i < counter; i++) {
result = Mathf.Lerp(0.5F, 1.0F, i / counter);
}
sw.Stop();
Debug.LogFormat("Using lerp for {3} iterations took: {0} ms, {1} ticks, result was: {2}",
sw.ElapsedMilliseconds, sw.ElapsedTicks, result, counter);
}
}
[/CODE]


Source: [url="http://forum.unity-community.de/topic/10012-mathematische-anfangerfrage/page__view__findpost__p__76073"]Mathematische Anfängerfrage[/url]
Sign in to follow this  


0 Comments


Recommended Comments

There are no comments to display.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×