Quali implicazioni ha JIT (javascript / canvas) vs. AOT (Flash) in termini di prestazioni di gioco basate su browser?


8

Nella mia esperienza, fino ad oggi, vedo ancora più di un ritardo visivo nel movimento / animazione delle entità nei giochi basati su JavaScript (Canvas) rispetto ai giochi basati su Flash.

Perché è questo: qual è esattamente la discrepanza al livello più elementare tra un compilatore JIT vs AOT nello scenario specifico di JavaScript vs. Flash.


2
Il codice flash nel browser non viene compilato in anticipo; Flash Player include una macchina virtuale per l'interpretazione del codice. L'unica piattaforma supportata da Flash tramite la compilazione AOT è iOS.
jhocking

Risposte:


4

Non è il metodo di compilazione che fa ritardare i giochi, è il garbage collector e Flash Garbage Collector è separato dai browser.

Penso di poter ragionevolmente credere che esegui Firefox, perché il Garbage Collector di Firefox è il peggior pezzo di merda che puoi ottenere, dal punto di vista dei giochi. Se apri solo una scheda e esegui un gioco JavaScript leggero, di solito è tollerabile, forse anche impercettibile. Ma se apri un sacco di schede, esegui qualcosa di un po 'più impegnativo o usi Firebug otterrai facilmente picchi di ritardo regolari oltre i 100 ms.

Non ho fatto test approfonditi per un po ', ma Chrome ha sempre fatto davvero bene in questo senso, e sia IE9 che Safari sembrano fare anche un lavoro accettabile.

Ho creato uno strumento per testare il ritardo JavaScript, puoi giocarci se ti piace: http://ebusiness.hopto.org/lagtest/


In realtà uso Chrome a causa del motivo esatto che hai indicato sopra, ho quasi gettato la spazzatura nel mix sopra ma volevo mantenere la domanda focalizzata. Anche in Chrome, la garbage collection fa comunque lampeggiare questo comparativo del ritardo visivo. Quindi da una prospettiva ingenua: qual è la soluzione a questo problema (oltre alla "migliore raccolta dei rifiuti")?
Anthony,

@Anthony Divertente, non vedo affatto questo problema in Chrome, ottieni altro che barre verdi se esegui il mio lagtest? Ovviamente puoi sempre scrivere un programma che richiede troppo tempo per essere eseguito ad un certo punto, sei sicuro che non sia il problema?
aaaaaaaaaaaa

La FF è stata inquietantemente fragile negli ultimi due anni. Non sono sicuro di cosa si tratti, ma le versioni costanti che non fanno altro che forzare gli autori dei plug-in ad adattarsi / aggiornare mentre i bug gravi vengono ignorati odori come agile applicato male o mischia per me. È un vero peccato.
Erik Reppen,

3

È difficile da dire senza guardare il codice reale ma alcuni punti:

  • Flash è in circolazione da più tempo. Le persone che creano strumenti e librerie per questo hanno più esperienza nella gestione dell'animazione. Non sono un grande fan degli strumenti e della tecnologia proprietaria, ma non busserò mai a uno sviluppatore di ActionScript che sa cosa sta facendo.

  • I browser JIT sono anche relativamente nuovi per gli sviluppatori JS. Le migliori scelte per perfe-titolari davvero raffinati sono ancora qualcosa che stiamo ordinando come comunità. In molti casi, i def inline di funzione erano una cosa stupida al limite. Ora è un ottimo modo per aumentare la perf in molti scenari JIT.

  • La normalizzazione per molti browser non deve, ma spesso non riesce a sfruttare appieno le funzionalità complete di un determinato browser.

  • (modifica: non proprio su questo, ma potrebbe esserci ancora un punto qui - Erik) Il plug-in Flash è compatibile con i vettori ed è ampiamente compreso come trarne il massimo vantaggio. Resta da vedere se gli schemi di ereditarietà ci faranno molto bene con gli oggetti contestuali su tela, ma dubito che sarà allo stesso livello di vincita che si ottiene dal vettore.


Devo leggere personalmente alcuni dei termini, ma anche questa è un'ottima risposta.
Anthony,

1
Penso di essermi sbagliato sul lato vettoriale di esso. In Canvas sono presenti metodi API basati su vettori. Penso di essere stato corretto in modo errato di recente da qualcuno che ha appena fatto ipotesi errate sul fatto che stai sempre producendo bitmap. Ho letto la grafica JavaScript sovralimentata di O'Reilly sul treno e lo consiglio vivamente.
Erik Reppen,

3

Una cosa interessante che mi sorprende che nessuno abbia ancora menzionato è la differenza nei tipi di compilazione JIT, perché Flash è ancora compilato JIT e, nella maggior parte dei browser moderni, lo è anche JavaScript, tuttavia Flash è un linguaggio fortemente tipizzato, il che significa ci sono un intero regno di ottimizzazioni che può fare (come emettere una chiamata direttamente a un metodo (qualcosa che JavaScript non può fare)), che JavaScript non può fare perché è digitato in modo dinamico. È possibile sostituire l'intera definizione di una funzione in JavaScript in qualsiasi momento desiderato e quella nuova definizione è ciò che deve essere chiamato. (è ancora possibile che JavaScript esegua una chiamata indiretta che non sarebbe molto più costosa). L'accesso al campo su un campo è in realtà un esempio migliore della chiamata del metodo, poiché JavaScript non può nemmeno farlo indirettamente,

Un'altra differenza nelle prestazioni è, come già accennato, il GC. Ho il sospetto (non ho verificato) che la maggior parte dei browser utilizzi un GC di conteggio dei riferimenti (poiché tutta la memoria allocata dal GC per una pagina può essere liberata quando la pagina viene lasciata, in realtà è uno dei posti migliori per utilizzare un GC di conteggio dei riferimenti ) o un GC a scansione conservativa (come Boehm). Quest'ultimo può essere notevolmente più lento del primo se non è implementato correttamente. (Boehm è un esempio di una corretta implementazione) Flash d'altra parte usa un preciso GC (molto più facile da fare in un sistema fortemente tipizzato). Poiché Flash utilizza un GC preciso, non ha l'overhead di runtime del conteggio dei riferimenti. (che non è enorme, ma è ancora lì) Un buon esempio di un GC preciso è lo SGen di Mono, che compatta anche i cumuli.

Poi arriva il fatto che JavaScript non è stato progettato pensando all'animazione. (come è stato anche menzionato) Per quanto ne so, nessun browser emetterà istruzioni in stile SSE per i loop di animazione, laddove le funzioni di rendering di base in Flash sono state probabilmente ottimizzate a mano per le massime prestazioni. (in alcuni punti viene scritto in assembly grezzo)

Tutto sommato, si riduce al fatto che un linguaggio dinamico sarà sempre più lento di uno digitato staticamente se deve essere compilato in modo tempestivo in modo da non far lamentare all'utente la sua lentezza.


Java è anche fortemente tipizzato e altamente performante quando si eseguono i benchmark. Scommetterei ancora sugli sviluppatori Node.js contro gli sviluppatori Java in un concorso di prestazioni per un'app Web di base sul lato server che presume appena al di sopra dei livelli mediocri di talento. I tipi forti contro quelli deboli sono un compromesso di progettazione, non una garanzia che la tua app funzionerà più velocemente se lasciata a mani umane che fanno cose stupide quando c'è molto più codice da destreggiarsi. Non che consiglierei di scrivere un motore 3D in JS, Flash o Java.
Erik Reppen,

0

IMHO che differnece deriva dal fatto che Flash è stato costruito da terra per fare esattamente questo, animazioni. Flash implementa (anche se a malapena un giudizio importante) tecniche per una visualizzazione più fluida in esecuzione per impostazione predefinita, quando in JS dovresti effettuare tali implementazioni manualmente.

Ci sono esempi di grandi implementazioni di JS / Canvas che funzionano ancora meglio della maggior parte dei giochi Flash che vedo in giro. Tutto dipende dallo sviluppatore che li crea.


0

a parte l'aspetto GC, JIT di queste tecnologie, esiste un divario tra l'utilizzo dell'hardware.

nell'ultima versione di Flash Player, Flash ha iniziato a ricorrere all'accelerazione hardware per il rendering di quelle immagini, il che rende il processo di rendering più veloce e migliore qualità. mentre d'altra parte, i giochi basati su JS su alcuni browser (FF, CHROME) non hanno ancora iniziato. C'era tuttavia un'eccezione, il browser IE9 ha iniziato a riprogettare dal livello di astrazione hardware, i browser di IE9 hanno fatto enormi progressi nell'uso dell'accelerazione hardware, quindi il rendering della grafica su questi browser è decisamente migliore e più veloce di altri browser.


Proprio come una nota a margine, in chrome / ff puoi forzare l'accelerazione hardware (webgl), indipendentemente dal fatto che sia fatto tramite il codice e / o le impostazioni di configurazione del browser, il leggero vantaggio è disponibile. In ogni caso la mia ipotesi è che l'impianto in chrome / ff sia ancora più acerbo rispetto a IE 9+
Anthony

@Anthony sì, decisamente d'accordo. ormai giorni nel regno dell'API grafica, DX supera OPENGL un bel po ', e in nessun modo Chrome o altri browser possono fare meglio di IE9, almeno per un breve periodo.
tintinnio il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.