Nach meiner Erfahrung sehe ich bis heute in JavaScript (Canvas) -basierten Spielen immer noch eine größere visuelle Verzögerung bei der Bewegung / Animation von Entitäten als in Flash-basierten Spielen.
Warum ist das so - was genau ist die Diskrepanz auf der grundlegendsten Ebene zwischen einem JIT- und einem AOT-Compiler im spezifischen Szenario von JavaScript und Flash?
Antworten:
Es ist nicht die Kompilierungsmethode, die die Spiele verzögert, sondern der Garbage Collector, und der Flash Garbage Collector ist von den Browsern getrennt.
Ich denke, ich kann ziemlich sicher begründen, dass Sie Firefox ausführen, da der Firefox-Garbage Collector aus spielerischer Sicht der schlimmste Mist ist, den Sie bekommen können. Wenn Sie nur einen Tab öffnen und ein leichtes JavaScript-Spiel darin ausführen, ist dies normalerweise tolerierbar, möglicherweise sogar unbemerkt. Wenn Sie jedoch eine Reihe von Registerkarten öffnen, etwas anspruchsvolleres ausführen oder Firebug verwenden, erhalten Sie leicht regelmäßige Verzögerungsspitzen über 100 ms hinaus.
Ich habe eine Weile keine umfangreichen Tests durchgeführt, aber Chrome hat sich in dieser Hinsicht immer sehr gut geschlagen, und sowohl IE9 als auch Safari scheinen ebenfalls einen akzeptablen Job zu machen.
Ich habe ein Tool zum Testen der JavaScript-Verzögerung erstellt. Sie können damit spielen, wenn Sie möchten: http://ebusiness.hopto.org/lagtest/
quelle
Es ist schwer zu sagen, ohne den tatsächlichen Code zu betrachten, aber ein paar Punkte:
Flash gibt es schon länger. Personen, die Tools und Bibliotheken dafür erstellen, haben mehr Erfahrung im Umgang mit Animationen. Ich bin kein großer Fan der Tools und der proprietären Technologie, aber ich werde niemals einen ActionScript-Entwickler anklopfen, der weiß, was er tut.
JIT-Browser sind auch für JS-Entwickler relativ neu. Die beste Wahl für wirklich ausgefeilte Perf-Initiativen sind immer noch etwas, das wir als Community aussortieren. Inline-Funktionsdefs waren in vielen Fällen eine dumme Borderline-Sache. Jetzt ist es eine großartige Möglichkeit, die Leistung in vielen JIT-Szenarien zu steigern.
Das Normalisieren für unzählige Browser muss nicht, führt jedoch häufig dazu, dass die Funktionen eines bestimmten Browsers nicht voll ausgeschöpft werden.
(Bearbeiten: In diesem Fall nicht ganz richtig, aber hier könnte es noch einen Punkt geben - Erik) Das Flash-Plug-In ist vektorfreundlich und es ist allgemein bekannt, wie man das maximal ausnutzt. Es bleibt abzuwarten, ob Vererbungsschemata uns mit Canvas-Kontextobjekten eine Menge Gutes bringen werden, aber ich bezweifle, dass dies in dem Maße der Gewinn sein wird, den Sie aus dem Vektor ziehen.
quelle
Eine interessante Sache, von der ich überrascht bin, dass sie noch niemand erwähnt hat, ist der Unterschied in den Arten der JIT-Kompilierung, da Flash immer noch JIT-kompiliert ist, und in den meisten modernen Browsern auch JavaScript, jedoch ist Flash eine stark typisierte Sprache, was bedeutet Es gibt eine ganze Reihe von Optimierungen, die durchgeführt werden können (z. B. das direkte Ausgeben eines Aufrufs einer Methode (was JavaScript nicht kann)), die JavaScript nicht ausführen kann, weil es dynamisch typisiert ist. Sie können die gesamte Definition einer Funktion in JavaScript jederzeit ersetzen, und diese neue Definition muss aufgerufen werden. (JavaScript kann immer noch einen indirekten Aufruf ausführen, der allerdings nicht viel teurer wäre.) Der Feldzugriff auf ein Feld ist tatsächlich ein besseres Beispiel als der Methodenaufruf, da JavaScript dies nicht einmal indirekt ausführen kann.
Ein weiterer Leistungsunterschied ist, wie bereits erwähnt, der GC. Ich vermute (ich habe nicht überprüft), dass die meisten Browser entweder einen Referenzzähl-GC verwenden (da der gesamte Speicher, den der GC für eine Seite zugewiesen hat, freigegeben werden kann, wenn die Seite verlassen wird, ist dies tatsächlich einer der besten Orte, um einen Referenzzähl-GC zu verwenden ) oder ein konservativer Scan-GC (wie Boehm). Letzteres kann erheblich langsamer sein als Ersteres, wenn es nicht richtig implementiert wird. (Boehm ist ein Beispiel für eine richtige Implementierung) Flash verwendet dagegen einen präzisen GC (viel einfacher in einem stark typisierten System). Da Flash einen präzisen GC verwendet, hat es nicht den Laufzeitaufwand für die Referenzzählung. (was nicht riesig ist, aber immer noch da ist) Ein gutes Beispiel für einen präzisen GC ist Monos SGen, der auch die Haufen verdichtet.
Dann kommt die Tatsache, dass JavaScript nicht für Animationen entwickelt wurde. (wie auch erwähnt) Soweit ich weiß, gibt kein Browser Anweisungen im SSE-Stil für die Animationsschleifen aus, wobei die Kern-Rendering-Funktionen in Flash wahrscheinlich von Hand für maximale Leistung optimiert wurden. (an einigen Stellen wird in Rohmontage geschrieben)
Alles in allem kommt es darauf an, dass eine dynamische Sprache immer langsamer ist als eine statisch typisierte, wenn sie rechtzeitig kompiliert werden muss, damit sich der Benutzer nicht über ihre Langsamkeit beschwert.
quelle
Meiner Meinung nach kommt dieser Unterschied von der Tatsache, dass Flash aus dem Boden gebaut wurde, um genau das zu tun, Animationen. Flash implementiert (wenn auch nach allgemeiner Einschätzung schlecht) Techniken für eine reibungslosere Visualisierung, die standardmäßig ausgeführt wird, wenn Sie diese Implementierungen in JS manuell vornehmen müssten.
Es gibt Beispiele für großartige Implementierungen von JS / Canvas, die noch besser laufen als die meisten Flash-Spiele, die ich sehe. Es kommt alles darauf an, dass der Entwickler sie herstellt.
quelle
Abgesehen vom GC, JIT-Aspekt dieser Technologien, gibt es eine Lücke zwischen der Verwendung von Hardware.
In der neuesten Version von Flash Player hat Flash begonnen, beim Rendern dieser Bilder auf Hardwarebeschleunigung zurückzugreifen, wodurch der Renderprozess schneller und die Qualität besser wird. Auf der anderen Seite haben JS-gesteuerte Spiele in einigen Browsern (FF, CHROME) dies bereits begonnen. Es gab jedoch eine Ausnahme: Der IE9-Browser hat begonnen, sich von der Hardware-Abstraktionsschicht neu zu entwickeln. Die Browser von IE9 hatten enorme Fortschritte bei der Nutzung der Hardwarebeschleunigung erzielt. Daher ist das Rendern von Grafiken in diesen Browsern definitiv besser und schneller als in anderen Browsern.
quelle