Welche Auswirkungen hat JIT (Javascript / Canvas) gegenüber AOT (Flash) auf die browserbasierte Spieleleistung?

8

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?

Anthony
quelle
2
Der Flash-Code im Browser wird nicht im Voraus kompiliert. Der Flash Player enthält eine virtuelle Maschine zur Interpretation des Codes. Die einzige Plattform, die Flash durch AOT-Kompilierung unterstützt, ist iOS.
Schockieren

Antworten:

4

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/

aaaaaaaaaaaa
quelle
Ich verwende tatsächlich Chrom, weil Sie genau den Grund angegeben haben, den Sie oben angegeben haben. Ich habe fast die Speicherbereinigung in die obige Mischung geworfen, wollte aber die Frage fokussieren. Selbst in Chrom verursacht die Speicherbereinigung immer noch diese visuelle Verzögerung im Vergleich zu Flash. Also aus einer naiven Perspektive - was ist die Lösung für dieses Problem (außer nur "bessere Müllabfuhr")?
Anthony
@Anthony Lustig, ich sehe dieses Problem in Chrome überhaupt nicht. Bekommst du alles andere als grüne Balken, wenn du mein Lagtest ausführst? Natürlich können Sie immer ein Programm schreiben, dessen Ausführung einfach zu lange dauert. Sind Sie sicher, dass dies nicht das Problem ist?
aaaaaaaaaaa
FF war in den letzten Jahren beunruhigend zerbrechlich. Ich bin mir nicht sicher, worum es geht, aber die ständigen Veröffentlichungen, die nichts anderes tun, als Plug-In-Autoren zur Anpassung / Aktualisierung zu zwingen, während schwerwiegende Fehler ignoriert werden, riechen nach falsch angewendetem Agile oder Scrum für mich. Es ist eine verdammte Schande.
Erik Reppen
3

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.

Erik Reppen
quelle
Ich muss mich persönlich über einige Begriffe informieren, aber dies ist auch eine großartige Antwort.
Anthony
1
Ich glaube, ich habe mich in Bezug auf die Vektorseite geirrt. In Canvas sind vektorbasierte API-Methoden integriert. Ich glaube, ich wurde kürzlich von jemandem falsch korrigiert, der gerade falsche Annahmen darüber gemacht hat, dass Sie immer Bitmaps ausgeben. Ich habe O'Reillys Supercharged JavaScript Graphics im Zug gelesen und kann es nur empfehlen.
Erik Reppen
3

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.

Orvid König
quelle
Java ist auch stark typisiert und sehr leistungsfähig, wenn Sie die Benchmarks durchführen. Ich würde immer noch auf Node.js Entwickler im Vergleich zu den Java-Entwicklern in einem Leistungswettbewerb für eine einfache serverseitige Web-App wetten, die knapp über dem mittelmäßigen Talentniveau liegt. Starke gegen schwache Typen sind ein Design-Kompromiss, keine Garantie dafür, dass Ihre App schneller läuft, wenn sie menschlichen Händen überlassen wird, die dumme Dinge tun, wenn es viel mehr Code zum Jonglieren gibt. Nicht, dass ich empfehlen würde, eine 3D-Engine in JS, Flash oder Java zu schreiben.
Erik Reppen
0

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.

Galvas
quelle
0

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.

Zinken
quelle
Nur als Randnotiz: In Chrome / ff können Sie die Hardwarebeschleunigung (Webgl) erzwingen, unabhängig davon, ob dies über Code- und / oder Browserkonfigurationseinstellungen erfolgt. Der leichte Vorteil ist verfügbar. Auf jeden Fall gehe ich davon aus, dass die Implementierung in Chrome / ff noch unreifer ist als in IE 9+
Anthony
@ Anthony yep, stimme definitiv zu. Heutzutage übertrifft DX im Bereich der Grafik-API OPENGL erheblich, und Chrome oder andere Browser können zumindest für kurze Zeit keine bessere Leistung als IE9 erbringen.
Zinking