Câu trả lời ngắn gọn:
SVG sẽ dễ dàng hơn cho bạn, vì lựa chọn và di chuyển nó xung quanh đã được tích hợp sẵn. Các đối tượng SVG là các đối tượng DOM, vì vậy chúng có các trình xử lý "nhấp chuột", v.v.
DIV vẫn ổn nhưng cồng kềnh và có hiệu suất khủng khiếp khi tải với số lượng lớn.
Canvas có hiệu suất tốt nhất, nhưng bạn phải tự thực hiện tất cả các khái niệm về trạng thái được quản lý (lựa chọn đối tượng, v.v.) hoặc sử dụng thư viện.
Câu trả lời dài:
HTML5 Canvas chỉ đơn giản là một bề mặt vẽ cho bản đồ bit. Bạn thiết lập để vẽ (Nói với màu sắc và độ dày đường kẻ), vẽ thứ đó và sau đó Canvas không biết gì về điều đó: Nó không biết nó ở đâu hoặc bạn vừa vẽ gì, đó là chỉ pixel. Nếu bạn muốn vẽ hình chữ nhật và để chúng di chuyển xung quanh hoặc có thể lựa chọn thì bạn phải mã hóa tất cả những thứ đó từ đầu, bao gồm cả mã để nhớ rằng bạn đã vẽ chúng.
Mặt khác, SVG phải duy trì các tham chiếu đến từng đối tượng mà nó hiển thị. Mỗi phần tử SVG / VML bạn tạo là một phần tử thực trong DOM. Theo mặc định, điều này cho phép bạn theo dõi tốt hơn các yếu tố bạn tạo và giúp xử lý các sự kiện như sự kiện chuột theo mặc định dễ dàng hơn, nhưng nó chậm đi đáng kể khi có một số lượng lớn đối tượng
Các tham chiếu DOMG DOM đó có nghĩa là một số công việc cần thiết để xử lý những thứ bạn vẽ được thực hiện cho bạn. Và SVG nhanh hơn khi kết xuất các đối tượng thực sự lớn , nhưng chậm hơn khi kết xuất nhiều đối tượng.
Một trò chơi có thể sẽ nhanh hơn trong Canvas. Một chương trình bản đồ khổng lồ có lẽ sẽ nhanh hơn trong SVG. Nếu bạn muốn sử dụng Canvas, tôi có một số hướng dẫn về cách đưa các đối tượng có thể di chuyển lên và chạy ở đây .
Canvas sẽ tốt hơn cho những thứ nhanh hơn và thao tác bitmap nặng (như hoạt hình), nhưng sẽ mất nhiều mã hơn nếu bạn muốn có nhiều tương tác.
Tôi đã chạy một loạt các số trên bản vẽ do HTML DIV tạo ra so với bản vẽ được tạo bởi Canvas. Tôi có thể tạo một bài đăng lớn về lợi ích của mỗi loại, nhưng tôi sẽ đưa ra một số kết quả có liên quan trong các thử nghiệm của mình để xem xét cho ứng dụng cụ thể của bạn:
Tôi đã tạo các trang thử nghiệm Canvas và HTML DIV, cả hai đều có các "nút" có thể di chuyển được. Các nút canvas là các đối tượng tôi đã tạo và theo dõi trong Javascript. Các nút HTML là Divs di động.
Tôi đã thêm 100.000 nút vào mỗi hai bài kiểm tra của mình. Họ thực hiện khá khác nhau:
Tab kiểm tra HTML mất quá nhiều thời gian để tải (được hẹn giờ ở mức dưới 5 phút, chrome yêu cầu giết trang lần đầu tiên). Trình quản lý tác vụ của Chrome cho biết tab đó đang chiếm tới 168 MB. Nó chiếm tới 12-13% thời gian CPU khi tôi nhìn vào nó, 0% khi tôi không nhìn.
Tab Canvas được tải trong một giây và chiếm 30MB. Nó cũng chiếm 13% thời gian của CPU mọi lúc, bất kể người ta có nhìn vào nó hay không. (Chỉnh sửa 2013: Họ hầu như đã sửa nó)
Việc kéo trên trang HTML mượt mà hơn, được thiết kế mong đợi, vì thiết lập hiện tại là vẽ lại MỌI THỨ cứ sau 30 mili giây trong thử nghiệm Canvas. Có rất nhiều tối ưu hóa cần có cho Canvas cho việc này. (vô hiệu hóa canvas là dễ nhất, cũng là các vùng cắt, vẽ lại có chọn lọc, v.v. chỉ phụ thuộc vào mức độ bạn cảm thấy muốn thực hiện)
Không còn nghi ngờ gì nữa, bạn có thể khiến Canvas trở nên nhanh hơn khi thao tác đối tượng như các div trong bài kiểm tra đơn giản đó, và tất nhiên là nhanh hơn rất nhiều trong thời gian tải. Vẽ / tải nhanh hơn trong Canvas và cũng có nhiều chỗ để tối ưu hóa hơn (nghĩa là loại trừ những thứ ngoài màn hình rất dễ dàng).
Phần kết luận:
- SVG có lẽ tốt hơn cho các ứng dụng và ứng dụng có ít mục (dưới 1000? Phụ thuộc thực sự)
- Canvas tốt hơn cho hàng ngàn đối tượng và thao tác cẩn thận, nhưng cần nhiều mã hơn (hoặc thư viện) để đưa nó lên khỏi mặt đất.
- Các Diva HTML rất cục mịch và không mở rộng quy mô, việc tạo một vòng tròn chỉ có thể thực hiện được với các góc tròn, tạo ra các hình dạng phức tạp là có thể nhưng liên quan đến hàng trăm div nhỏ trên pixel. Sự điên rồ xảy ra.