Krótka odpowiedź:
SVG byłoby łatwiejsze dla Ciebie , ponieważ zaznaczanie i przenoszenie jest już wbudowane. Obiekty SVG są obiektami DOM, więc mają procedury obsługi „klikania” itp.
DIV są w porządku, ale niezgrabne i mają okropne wyniki ładowania przy dużej liczbie.
Canvas ma najlepszą wydajność, ale musisz samodzielnie wdrożyć wszystkie koncepcje stanu zarządzanego (wybór obiektu itp.) Lub użyć biblioteki.
Długa odpowiedź:
HTML5 Canvas to po prostu powierzchnia do rysowania mapy bitowej. Ustawiłeś rysować (powiedz z kolorem i grubością linii), narysuj tę rzecz, a następnie Płótno nie ma o tym żadnej wiedzy: nie wie, gdzie to jest ani co jest właśnie narysowane, to jest tylko piksele. Jeśli chcesz narysować prostokąty i pozwolić im się poruszać lub wybierać, musisz zakodować wszystko od zera, w tym kod, aby pamiętać, że je narysowałeś.
Z drugiej strony SVG musi utrzymywać odniesienia do każdego renderowanego obiektu. Każdy tworzony element SVG / VML jest prawdziwym elementem w DOM. Domyślnie pozwala to na znacznie lepsze śledzenie tworzonych elementów i sprawia, że radzenie sobie z takimi rzeczami jak zdarzenia myszy jest łatwiejsze, ale znacznie spowalnia, gdy istnieje duża liczba obiektów
Te odniesienia do SVG DOM oznaczają, że część pracy związanej z rysowaniem rzeczy jest zrobiona za Ciebie. A SVG jest szybszy podczas renderowania naprawdę dużych obiektów, ale wolniejszy podczas renderowania wielu obiektów.
Gra byłaby prawdopodobnie szybsza w Canvas. Ogromny program mapowy byłby prawdopodobnie szybszy w SVG. Jeśli chcesz korzystać z Canvas, mam tutaj tutoriale na temat uruchamiania ruchomych obiektów i uruchamiania ich tutaj .
Płótno byłoby lepsze do szybszych rzeczy i ciężkich operacji bitmapowych (takich jak animacja), ale zajmie więcej kodu, jeśli chcesz dużo interaktywności.
Znalazłem wiele liczb na rysunku wykonanym w HTML DIV w porównaniu do rysunku na płótnie. Mógłbym napisać ogromny post o zaletach każdego z nich, ale podam kilka istotnych wyników moich testów do rozważenia dla konkretnego zastosowania:
Zrobiłem strony testowe Canvas i HTML DIV, obie miały ruchome „węzły”. Węzły Canvas to obiekty, które utworzyłem i które śledziłem w Javascript. Węzły HTML były ruchomymi divami.
Dodałem 100 000 węzłów do każdego z moich dwóch testów. Wystąpili zupełnie inaczej:
Załadowanie karty testowej HTML trwało wieczność (czas trwania nieco poniżej 5 minut, Chrome poprosił o zabicie strony za pierwszym razem). Menedżer zadań Chrome twierdzi, że karta zajmuje 168 MB. Zajmuje to 12–13% czasu procesora, gdy na niego patrzę, 0%, gdy nie patrzę.
Karta Canvas ładowana jest w ciągu jednej sekundy i zajmuje 30 MB. Zajmuje również 13% czasu procesora przez cały czas, niezależnie od tego, czy ktoś na to patrzy. (Edycja 2013: Naprawiono to głównie)
Przeciąganie na stronie HTML jest płynniejsze, czego oczekuje projekt, ponieważ obecna konfiguracja polega na przerysowaniu WSZYSTKO co 30 milisekund w teście Canvas. W tym celu można zoptymalizować Canvas. (najłatwiejsze jest unieważnienie obszaru roboczego, także wycinanie regionów, wybiórcze przerysowywanie itp. zależy tylko od tego, jak bardzo chcesz się wdrożyć)
Nie ma wątpliwości, że Canvas może być szybszy w manipulowaniu obiektami, ponieważ div w tym prostym teście, i oczywiście znacznie szybciej w czasie ładowania. Rysowanie / ładowanie jest szybsze w kanwie i ma również znacznie więcej miejsca na optymalizacje (tj. Wykluczanie rzeczy, które są poza ekranem, jest bardzo łatwe).
Wniosek:
- SVG jest prawdopodobnie lepszy dla aplikacji i aplikacji z kilkoma elementami (mniej niż 1000? Zależy naprawdę)
- Płótno jest lepsze dla tysięcy obiektów i starannej manipulacji, ale potrzeba dużo więcej kodu (lub biblioteki), aby zdjąć go z ziemi.
- Divy HTML są nieporęczne i nie skalują się, dzięki czemu okrąg jest możliwy tylko z zaokrąglonymi narożnikami, dzięki czemu możliwe są złożone kształty, ale obejmują setki małych div o szerokości piksela. Następuje szaleństwo.