ich grueble gerade, wie ich es hinbekomme, dass meine Animationscode auf jedem Prozessor zu gleichen optischen Ergenbissen fuehrt.
Konkret geht es darum, dass die Oszillatoren(TM) sich immer gleich schnell bewegen sollen.
Mit den Sinusoszillatoren funktioniert das bereits: die Zeitbasis ist millis() und egal wann oder wie oft ich die aufrufe, ist die resultierende Funktionskurve immer auf millis synchronisiert.
Nun sitze ich gerade vor ein paar vollgekritzelten Baettern Papier und ueberlege, wie ich das mit den Linearoszillatoren mache. Problem ist, dass es natuerlich nicht funktioniert, die bei jedem Call um einen statischen Wert hochzuzaehlen.
Vielmehr ist es erforderlich, die auf Basis einer festgelegten Geschwindigkeit als angestrebte Werteveraenderung/s hoch- oder runterzuzaehlen.
Fuehrt da irgendein Weg daran vorbei, fuer jeden einzelnen Oszillator die Zeit des letzten Aufrufs zu speichern, die ins Verhaltnis zur momentanen Zeit zu setzen und dann die Schrittweite fuer den naechsten Schritt zu berechnen?
Ich habe ca. 30 solche linearen Rampen und das wuerde bedeuten, 120 Byte RAM nur fuer die Zeitstempel des letzten Aufrufs zu verwenden.
Die Sinussachen funktionieren gut und schnell. Lookup Tabelle.
Es geht mir um das lineare Hochzaehlen von uint16_t Werten.
Millis und Modulo hat den Nachteil, dass man dann genau im richtigen Moment aufrufen muss. Das kann ich (wegen schwankenden fps) nicht garantieren.
Vielleicht trifft man zufaellig genau z.B. millis() % 2 == 0, vielleicht nicht.
Die resultierende Funktionskurve wird keine Gerade, sondern eine Zig-Zag-Linie.
Alles, was ich habe, ist die aktuelle Zeit millis() und eine festgelegte Geschwindigkeit 1000/s.
Und was fehlt dir ?
Wenn ich ihn 2x update muesste ich jeweils 500 addieren, wenn ich ihn 10x update jeweils 100
Das ist vermutlich völlig Quatsch dein Denkfehler.
Weiss nicht was du unter "synchron" verstehst, aber am einfachsten ermittelst du das Ergebnis direkt aus millis(), egal wie oft du es berechnest.
Was soll passieren, wenn dein uint16_t überläuft? oder wann soll deine "lineare Funktion" neu anfangen?