Estou tentando escolher a tecnologia certa para usar na atualização de um projeto que basicamente renderiza milhares de pontos em um gráfico com zoom e panorâmica. A implementação atual, usando Protovis, tem baixo desempenho. Confira aqui:
http://www.planethunters.org/classify
Existem cerca de 2.000 pontos quando totalmente reduzido. Tente usar as alças na parte inferior para aumentar um pouco o zoom e arraste para se movimentar. Você verá que é bastante instável e o uso da CPU provavelmente sobe até 100% em um núcleo, a menos que você tenha um computador muito rápido. Cada mudança na área de foco chama um redesenho para protovis que é muito lento e é pior com mais pontos desenhados.
Eu gostaria de fazer algumas atualizações na interface, bem como alterar a tecnologia de visualização subjacente para ser mais responsiva com animação e interação. No artigo a seguir, parece que a escolha é entre outra biblioteca baseada em SVG ou baseada em canvas:
http://www.sitepoint.com/how-to-choose-between-canvas-and-svg/
d3.js , que cresceu a partir do Protovis, é baseado em SVG e supostamente é melhor para renderizar animações . No entanto, tenho dúvidas sobre o quanto melhor e qual é seu teto de desempenho. Por esse motivo, também estou considerando uma revisão mais completa usando uma biblioteca baseada em tela como o KineticJS . No entanto, antes de ir muito longe no uso de uma abordagem ou outra, gostaria de ouvir alguém que fez um aplicativo da web semelhante com tantos dados e obter sua opinião.
O mais importante é o desempenho, com foco secundário na facilidade de adicionar outros recursos de interação e programar a animação. Provavelmente não haverá mais de 2.000 pontos de uma vez, com aquelas pequenas barras de erro em cada um. Aumentar, diminuir e girar ao redor precisam ser suaves. Se as bibliotecas SVG mais recentes são decentes nisso, talvez a facilidade de usar d3 supere a configuração aumentada para KineticJS, etc. Mas se houver uma grande vantagem de desempenho em usar um canvas, especialmente para pessoas com computadores mais lentos, então eu definitivamente preferiria seguir esse caminho.
Exemplo de aplicativo feito pelo NYTimes que usa SVG, mas ainda apresenta animação sem problemas: http://www.nytimes.com/interactive/2012/05/17/business/dealbook/how-the-facebook-offering-compares.html . Se eu conseguir esse desempenho e não precisar escrever meu próprio código de desenho de tela, provavelmente optaria pelo SVG.
Percebi que alguns usuários usaram um híbrido de manipulação de d3.js combinado com renderização de tela . Porém, não consigo encontrar muita documentação sobre isso online ou entre em contato com o OP desse post. Se alguém tiver alguma experiência com esse tipo de implementação DOM-to-Canvas ( demo , código ), gostaria de ouvir de você também. Parece ser um bom híbrido de capacidade de manipular dados e ter controle personalizado sobre como renderizá-los (e, portanto, o desempenho), mas estou me perguntando se ter que carregar tudo no DOM ainda vai desacelerar as coisas.
Eu sei que existem algumas perguntas semelhantes a esta, mas nenhuma delas pergunta exatamente a mesma coisa. Obrigado pela ajuda.
Acompanhamento : a implementação que acabei usando está em https://github.com/zooniverse/LightCurves