requestAnimationFrame

  • Ich war gerade ein wenig dabei mit JavaScript und dem Canvas-Element zu spielen, als ich folgende Fehlermeldung bekam:


    "Maximum call stack size exceeded"


    Nach einer kurzen Suchanfrage weiß ich nun, dass dies daher rührt, dass eine rekursive Funktion zu oft aufgerufen wird.
    Ich dachte aber genau für viele Animation/Positionsänderungen sei window.requestAnimatonFrame geeignet ?(



    Würde mich freuen , wenn jemand einen Tipp kennt um dies zu umgehen :)


    Hier noch der Code dazu:



    mfg Nita

  • Du hast einen kleinen Schönheitsfehler gemacht. Du rufst die update-Funktion direkt auf anstatt sie als Argument zu übergeben (Callback und so):


    JavaScript
    // Falsch
    requestAnimationFrame(this.uptade());
    // Richtig
    requestAnimationFrame(this.uptade);


    Wenn du Argumente übergeben willst:


    JavaScript
    requestAnimationFrame(function() {
        // Funktion aufrufen, viel Spaß beim leidigen Spiel mit dem Namensraum
    });


    Javascript ist leider alles andere als optimal geeignet für Animationen, siehe hier. Ich hatte auch meine Probleme und der Garbage Collector läuft einfach Amok wenn man eigentlich ganz normale Scripts für z.B. Spiel-Engines schreiben will.


    Man könnte auch einfach eine Referenz mittels bind() erstellen:



    Konsole (Feuerfuchs) meint:


    Code
    Zeile 11: Window -> file:///path/file.htm file.htm:17:8
    Zeile 12: Object { name: "Müslibox", position: 0, fahren: auto/this.fahren() }


    PS.: Beim noch mal drüber schauen stelle ich fest es müsste doch update und nicht uptade heißen? Außer natürlich es wird insistiert :D

  • Zitat

    Du hast einen kleinen Schönheitsfehler gemacht. Du rufst die update-Funktion direkt auf anstatt sie als Argument zu übergeben (Callback und so):


    Danke, sowas fällt einem selbst irgendwie nicht auf ;)


    Habs, jetzt erstmals so geändert, wobei ich nach deinem Nachtrag mit bind noch überlege darauf zurückzugreifen(finde ich sauberer)



    Wirkt irgendwie um einiges sauberer :)



    Zitat

    Beim noch mal drüber schauen stelle ich fest es müsste doch update und nicht uptade heißen? Außer natürlich es wird insistiert


    Ich und meine Englischkünste :D


    Edit: Habe das ganze nun auf bind umgemünzt und es klappt hervorragend :)
    Das einzige Problem, dass ich dort noch habe ist folgendes:


    [Blockierte Grafik: http://www.fotos-hochladen.net/uploads/hmimngsv2x30.png]


    Das this scheint hier immer abwechselnd das window-Object bzw. das richtige Spielfeld-Object zu referenzieren.
    Hier habe ich aber überhaupt keine Ahnung woher dieses seltsame Wechselspiel kommen könnte 8|


    So und hier noch des Rätsel Lösung:


    Es reich ein einfacher Aufruf via

    JavaScript
    requestAnimationFrame(this.fahren.bind(this));


    Der zweite Aufruf wie in Basis Beispiel oben, würde nähmlich eine zweite Rekursion einleiten, bei der
    this das window-Objekt referenziert :)

  • Ich hatte nur zwei Aufrufe gestartet um den Unterschied zu zeigen. Ein mal mit Referenz und ein mal ohne, was natürlich mit window als this endet was weder Sinn macht noch von irgendwem erwünscht ist ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!