Quais implicações JIT (javascript / canvas) vs. AOT (Flash) têm em termos de desempenho de jogos baseados em navegador?

8

Na minha experiência, até o dia de hoje, ainda vejo mais um atraso visual no movimento / animação da entidade em jogos baseados em JavaScript (Canvas) do que em jogos baseados em Flash.

Por que isso - qual é exatamente a discrepância no nível mais básico entre um compilador JIT vs AOT no cenário específico de JavaScript vs. Flash.

Anthony
fonte
2
O código Flash no navegador não é compilado com antecedência; o Flash Player inclui uma máquina virtual para interpretar o código. A única plataforma que o Flash suporta através da compilação AOT é o iOS.
jhocking

Respostas:

4

Não é o método de compilação que atrasa os jogos, é o coletor de lixo e o coletor de lixo Flash é separado dos navegadores.

Acho que posso raciocinar com confiança que você executa o Firefox, porque o coletor de lixo do Firefox é a pior porcaria que você pode obter, do ponto de vista de jogos. Se você abrir apenas uma guia e executar um jogo JavaScript leve nela, é geralmente tolerável, talvez até imperceptível. Mas se você abrir várias guias, execute algo um pouco mais exigente ou use o Firebug, e você obterá facilmente picos de atraso regulares além de 100 ms.

Eu não faço nenhum teste extenso há algum tempo, mas o Chrome sempre se saiu muito bem nesse sentido, e o IE9 e o Safari aparentemente também fazem um trabalho aceitável.

Eu criei uma ferramenta para testar o atraso do JavaScript, você pode jogar com ele se quiser: http://ebusiness.hopto.org/lagtest/

aaaaaaaaaaaa
fonte
Na verdade, eu uso o chrome por causa do motivo exato que você mencionou acima, quase joguei a coleta de lixo na mistura acima, mas queria manter a pergunta focada. Mesmo no cromo, a coleta de lixo ainda causa esse atraso visual em comparação ao flash. Então, de uma perspectiva ingênua - qual é a solução para esse problema (além de apenas "melhor coleta de lixo")?
Anthony
@ Anthony Engraçado, eu não vejo esse problema no Chrome, você recebe nada além de barras verdes se executar o meu lagtest? Claro que você sempre pode escrever um programa que simplesmente leva muito tempo para ser executado em algum momento. Tem certeza de que não é esse o problema?
Aaaaaaaaaaaa
FF tem sido perturbadoramente frágil nos últimos dois anos. Não tenho certeza do que se trata, mas as versões constantes que não fazem nada além de forçar os autores de plug-ins a se adaptarem / atualizarem, enquanto erros graves são cheiros ignorados como ágil ou scrum mal aplicado. É uma pena.
Erik Reppen
3

É difícil dizer sem olhar o código real, mas alguns pontos:

  • O flash existe há mais tempo. As pessoas que criam ferramentas e bibliotecas para ele têm mais experiência em lidar com animação. Não sou muito fã das ferramentas e da tecnologia proprietária, mas nunca vou bater em um desenvolvedor do ActionScript que sabe o que está fazendo.

  • Os navegadores JIT também são relativamente novos para desenvolvedores de JS. As melhores escolhas para iniciativas de aperfeiçoamento realmente refinadas ainda são algo que estamos escolhendo como comunidade. Defs de função embutida costumavam ser uma coisa burra na fronteira em muitos casos. Agora é uma ótima maneira de aumentar o desempenho em muitos cenários de JIT.

  • A normalização para muitos navegadores não precisa, mas geralmente resulta em não aproveitar ao máximo os recursos completos de um determinado navegador.

  • (editar: não está bem neste, mas ainda pode haver um ponto aqui - Erik) O plug-in Flash é compatível com vetores e é amplamente entendido como tirar o máximo proveito disso. Ainda não se sabe se os esquemas de herança nos farão muito bem com os objetos de contexto da tela, mas duvido que seja o mesmo grau de vitória que você obtém do vetor.

Erik Reppen
fonte
Preciso ler pessoalmente algumas das terminologias, mas essa também é uma ótima resposta.
Anthony
11
Eu acho que estava errado sobre o lado do vetor. O Canvas possui métodos de API baseados em vetores inseridos nele. Acho que fui mal corrigido recentemente por alguém que acabou de fazer suposições erradas sobre o fato de você estar sempre produzindo bitmaps. Estive lendo gráficos JavaScript sobrecarregados de O'Reilly no trem e eu recomendo.
Erik Reppen
3

Uma coisa interessante que me surpreende que ninguém tenha mencionado ainda é a diferença nos tipos de compilação JIT, porque o Flash ainda é compilado por JIT e, na maioria dos navegadores modernos, o JavaScript também é, no entanto, o Flash é uma linguagem fortemente tipada, o que significa existe todo um campo de otimizações que ele pode fazer (como emitir uma chamada para um método diretamente (algo que o JavaScript não pode fazer)), que o JavaScript não pode fazer porque é digitado dinamicamente. Você pode substituir toda a definição de uma função em JavaScript a qualquer momento, e essa nova definição é como deve ser chamada. (ainda é possível para o JavaScript fazer uma chamada indireta que não seria muito mais cara). O acesso ao campo em um campo é realmente um exemplo melhor do que a chamada de método, porque o JavaScript não pode fazer isso indiretamente,

Outra diferença no desempenho é, como já mencionado, o GC. Eu suspeito (não verifiquei) que a maioria dos navegadores usa um GC de contagem de referência (porque toda a memória que o GC alocado para uma página pode ser liberada quando a página é deixada, é realmente um dos melhores lugares para usar um GC de contagem de referência ) ou um GC de varredura conservador (como Boehm). O último pode ser consideravelmente mais lento que o primeiro, se não for implementado corretamente. (Boehm é um exemplo de implementação correta) O Flash, por outro lado, usa um GC preciso (muito mais fácil de fazer em um sistema fortemente tipado). Como o Flash usa um GC preciso, ele não possui a sobrecarga do tempo de execução da contagem de referência. (que não é enorme, mas ainda está lá) Um bom exemplo de um GC preciso é o SGen da Mono, que também compacta os montes.

Depois, chega o fato de que o JavaScript não foi projetado com a animação em mente. (como também foi mencionado) Até onde eu sei, nenhum navegador emitirá instruções no estilo SSE para os loops de animação, onde as funções principais de renderização no Flash provavelmente foram otimizadas manualmente para obter o desempenho máximo. (em alguns lugares sendo gravados em montagem bruta)

Em suma, tudo se resume ao fato de que uma linguagem dinâmica sempre será mais lenta que a de um tipo estaticamente, se tiver que ser compilada em tempo hábil, para não fazer o usuário reclamar da lentidão.

Orvid King
fonte
Java também é fortemente tipado e de alto desempenho quando você faz os benchmarks. Eu ainda apostaria nos desenvolvedores do Node.js. versus os desenvolvedores do Java em um concurso de desempenho para um aplicativo Web básico do lado do servidor, assumindo um pouco acima dos níveis de talento medíocres. Tipos fortes vs fracos são uma desvantagem de design, não uma garantia de que seu aplicativo será executado mais rapidamente quando deixado por mãos humanas que fazem coisas estúpidas quando há muito mais código para manipular. Não que eu recomende escrever um mecanismo 3D em JS, Flash ou Java.
precisa
0

IMHO que diferente vem do fato de que o Flash foi construído do zero para fazer exatamente isso, animações. O Flash implementa técnicas (apesar de mal julgadas importantes) para uma visualização mais suave em execução por padrão, quando em JS você precisaria fazer essas implementações manualmente.

Existem exemplos de ótimas implementações de JS / Canvas rodando ainda melhor que a maioria dos jogos em Flash que eu vejo por aí. Tudo vem para o desenvolvedor fazê-los.

Galvas
fonte
0

além do GC, aspecto JIT dessas tecnologias, existe uma lacuna entre o uso de hardware.

na versão mais recente do flash player, o flash começou a recorrer à aceleração de hardware para renderizar essas imagens, o que torna o processo de renderização mais rápido e com melhor qualidade. enquanto, por outro lado, os jogos controlados por JS em alguns navegadores (FF, CHROME) ainda não começaram. Porém, houve uma exceção: o navegador IE9 começou a re-arquitetar a partir da camada de abstração de hardware; os navegadores do IE9 fizeram um tremendo progresso no uso da aceleração de hardware; portanto, a renderização de gráficos nesses navegadores é definitivamente melhor e mais rápida do que outros navegadores.

zinking
fonte
Apenas como uma observação lateral, no chrome / ff você pode forçar a aceleração de hardware (webgl), seja feita via código e / ou configurações de configuração do navegador, a pequena vantagem está disponível. Em qualquer caso, a minha suposição é a implentation em cromo / ff é ainda mais imaturo do que no IE 9+
Anthony
@ Anthony sim, definitivamente concordo. Hoje em dia no domínio da API de gráficos, o DX está excedendo bastante o OPENGL e não há como o Chrome ou outros navegadores funcionarem melhor que o IE9, pelo menos por um curto período.
zinking