Jump to content
Unity Insider Forum

Jashan's Blog

Sign in to follow this  
  • entries
    5
  • comments
    9
  • views
    18,448

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

Sign in to follow this  
jashan

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...