A resposta curta:
O SVG seria mais fácil para você, uma vez que a seleção e a movimentação já estão integradas. Os objetos SVG são objetos DOM, portanto, eles têm manipuladores de "clique" etc.
Os DIVs são bons, mas são desajeitados e têm um desempenho terrível carregando em grandes números.
O Canvas tem o melhor desempenho, mas você deve implementar todos os conceitos de estado gerenciado (seleção de objetos etc.) ou usar uma biblioteca.
A resposta longa:
O HTML5 Canvas é simplesmente uma superfície de desenho para um mapa de bits. Você configura para desenhar (digamos, com uma cor e espessura da linha), desenha essa coisa e o Canvas não tem conhecimento dela: ela não sabe onde está ou o que acabou de desenhar, é apenas pixels. Se você deseja desenhar retângulos e fazer com que eles se movam ou sejam selecionáveis, é necessário codificar tudo isso do zero, incluindo o código para lembrar que você os desenhou.
O SVG, por outro lado, deve manter referências a cada objeto que ele renderiza. Todo elemento SVG / VML que você cria é um elemento real no DOM. Por padrão, isso permite que você acompanhe muito melhor os elementos criados e facilita o tratamento de coisas como eventos de mouse por padrão, mas fica mais lento quando há um grande número de objetos.
Essas referências DOM do SVG significam que parte do trabalho de lidar com as coisas que você desenha é feita para você. E o SVG é mais rápido ao renderizar objetos realmente grandes , mas mais lento ao renderizar muitos objetos.
Um jogo provavelmente seria mais rápido no Canvas. Um programa enorme de mapas provavelmente seria mais rápido no SVG. Se você deseja usar o Canvas, tenho alguns tutoriais sobre como colocar objetos móveis em funcionamento aqui .
O Canvas seria melhor para coisas mais rápidas e manipulação de bitmap pesada (como animação), mas exigirá mais código se você quiser muita interatividade.
Corri vários números em desenho feito em HTML DIV versus desenho em tela. Eu poderia fazer uma publicação enorme sobre os benefícios de cada um, mas apresentarei alguns dos resultados relevantes dos meus testes a serem considerados para sua aplicação específica:
Criei páginas de teste Canvas e HTML DIV, ambas com "nós" móveis. Os nós do Canvas eram objetos que eu criei e acompanhei em Javascript. Nós HTML eram Divs móveis.
Adicionei 100.000 nós a cada um dos meus dois testes. Eles tiveram um desempenho bem diferente:
A guia de teste HTML demorou uma eternidade para carregar (com tempo ligeiramente inferior a 5 minutos, o Chrome pediu para matar a página pela primeira vez). O gerenciador de tarefas do Chrome diz que essa guia ocupa 168 MB. Leva 12-13% do tempo de CPU quando estou olhando, 0% quando não estou olhando.
A guia Canvas é carregada em um segundo e ocupa 30 MB. Ele também ocupa 13% do tempo da CPU o tempo todo, independentemente de alguém estar olhando para ele. (Edição de 2013: eles consertaram isso principalmente)
Arrastar na página HTML é mais suave, o que é esperado pelo design, pois a configuração atual é redesenhar TUDO a cada 30 milissegundos no teste do Canvas. Há muitas otimizações para o Canvas para isso. (a invalidação de tela é a mais fácil, também as regiões de recorte, redesenho seletivo etc. depende apenas de quanto você deseja implementar)
Não há dúvida de que você pode fazer com que o Canvas seja mais rápido na manipulação de objetos como os divs nesse teste simples e, é claro, muito mais rápido no tempo de carregamento. Desenhar / carregar é mais rápido no Canvas e também tem muito mais espaço para otimizações (ou seja, excluir coisas que estão fora da tela é muito fácil).
Conclusão:
- O SVG provavelmente é melhor para aplicativos e aplicativos com poucos itens (menos de 1000? Depende mesmo)
- O Canvas é melhor para milhares de objetos e manipulação cuidadosa, mas é necessário muito mais código (ou biblioteca) para tirá-lo do papel.
- Divs HTML são desajeitadas e não escalam, é possível fazer um círculo apenas com cantos arredondados, criar formas complexas, mas envolve centenas de minúsculas divs minúsculas com largura de pixel. Loucura segue.