คำตอบสั้น ๆ :
SVG จะง่ายขึ้นสำหรับคุณเนื่องจากการเลือกและเคลื่อนย้ายไปมานั้นสร้างขึ้นแล้ววัตถุ SVG เป็นวัตถุ DOM ดังนั้นพวกเขาจึงมีตัวจัดการ "คลิก" ฯลฯ
DIV นั้นโอเค แต่เป็น clunky และมีประสิทธิภาพแย่มากที่โหลดจำนวนมาก
Canvas มีประสิทธิภาพที่ดีที่สุด แต่คุณต้องใช้แนวคิดทั้งหมดของสถานะที่ได้รับการจัดการ (การเลือกวัตถุ ฯลฯ ) ด้วยตัวคุณเองหรือใช้ไลบรารี
คำตอบที่ยาว:
HTML5 Canvas เป็นเพียงพื้นผิวการวาดสำหรับบิตแมป คุณตั้งค่าการวาด (พูดด้วยสีและความหนาของเส้น) วาดสิ่งนั้นแล้ว Canvas ไม่มีความรู้เกี่ยวกับสิ่งนั้น: มันไม่รู้ว่ามันอยู่ที่ไหนหรืออะไรที่คุณเพิ่งวาดมัน เพียงแค่พิกเซล หากคุณต้องการวาดสี่เหลี่ยมและเลื่อนมันไปมาหรือเลือกได้คุณต้องเขียนโค้ดทั้งหมดตั้งแต่เริ่มต้นรวมถึงรหัสที่ต้องจำไว้ว่าคุณวาดมัน
SVG ในทางกลับกันจะต้องรักษาการอ้างอิงไปยังวัตถุแต่ละรายการ องค์ประกอบ SVG / VML ทุกรายการที่คุณสร้างเป็นองค์ประกอบจริงใน DOM โดยค่าเริ่มต้นสิ่งนี้จะช่วยให้คุณสามารถติดตามองค์ประกอบที่คุณสร้างและจัดการกับสิ่งต่าง ๆ เช่นเหตุการณ์เมาส์ได้ง่ายขึ้นตามค่าเริ่มต้น แต่จะช้าลงอย่างมากเมื่อมีวัตถุจำนวนมาก
การอ้างอิง SVG DOM นั้นหมายถึงว่าบางส่วนของการจัดการกับสิ่งที่คุณวาดนั้นมีไว้สำหรับคุณ และ SVG นั้นเร็วกว่าเมื่อเรนเดอร์วัตถุขนาดใหญ่จริงๆ แต่ช้าลงเมื่อเรนเดอร์วัตถุจำนวนมาก
เกมอาจจะเร็วกว่าใน Canvas โปรแกรมแผนที่ขนาดใหญ่อาจจะเร็วกว่าใน SVG หากคุณไม่ต้องการที่จะใช้ผ้าใบ, ฉันมีบทเรียนบางอย่างเกี่ยวกับการได้รับวัตถุที่สามารถเคลื่อนย้ายขึ้นและทำงานที่นี่
Canvas จะดีกว่าสำหรับสิ่งที่เร็วกว่าและการจัดการบิตแมปขนาดใหญ่ (เช่นภาพเคลื่อนไหว) แต่จะใช้รหัสมากขึ้นถ้าคุณต้องการการโต้ตอบจำนวนมาก
ฉันใช้ตัวเลขเป็นจำนวนมากในการวาด HTML DIV และการวาดบนผืนผ้าใบ ฉันสามารถโพสต์ขนาดใหญ่เกี่ยวกับประโยชน์ของแต่ละข้อได้ แต่ฉันจะให้ผลลัพธ์ที่เกี่ยวข้องของการทดสอบเพื่อพิจารณาใบสมัครเฉพาะของคุณ:
ฉันสร้างเพจการทดสอบ Canvas และ HTML DIV ทั้งคู่มี "โหนด" ที่สามารถเคลื่อนย้ายได้ Canvas canvas เป็นวัตถุที่ฉันสร้างและติดตามใน Javascript โหนด HTML เป็น Divs ที่เคลื่อนย้ายได้
ฉันเพิ่ม 100,000 โหนดในการทดสอบทั้งสองครั้งของฉัน พวกเขาแสดงค่อนข้างแตกต่าง:
แท็บทดสอบ HTML ใช้เวลาตลอดไปในการโหลด (หมดเวลาที่น้อยกว่า 5 นาทีเล็กน้อยขอให้ Chrome ฆ่าหน้าเว็บในครั้งแรก) ตัวจัดการงานของ Chrome บอกว่าแท็บนั้นใช้เวลา 168MB ใช้เวลา CPU นาน 12-13% เมื่อฉันมองมัน 0% เมื่อฉันไม่ได้มอง
แท็บ Canvas โหลดในหนึ่งวินาทีและใช้เวลา 30MB นอกจากนี้ยังใช้เวลา CPU มากถึง 13% ตลอดเวลาโดยไม่คำนึงว่าจะมีใครดูหรือไม่ (แก้ไข 2013: พวกเขาส่วนใหญ่คงที่)
การลากบนหน้า HTML นั้นราบรื่นขึ้นซึ่งคาดว่าจะเกิดขึ้นจากการออกแบบเนื่องจากการตั้งค่าปัจจุบันคือการวาดใหม่ทุก ๆ 30 มิลลิวินาทีในการทดสอบ Canvas มีการปรับแต่งมากมายสำหรับ Canvas สำหรับสิ่งนี้ (การทำให้ผ้าใบไม่ถูกต้องเป็นวิธีที่ง่ายที่สุดรวมถึงการตัดภูมิภาคการเลือกภาพร่างใหม่ ฯลฯ ขึ้นอยู่กับว่าคุณรู้สึกอยากนำไปใช้อย่างไร)
ไม่ต้องสงสัยเลยว่าคุณสามารถทำให้ Canvas ทำงานได้เร็วขึ้นเมื่อจัดการกับวัตถุในขณะที่ทำการทดสอบอย่างง่ายและแน่นอนว่าเร็วขึ้นมากในเวลาโหลด การวาด / การโหลดเร็วกว่าใน Canvas และมีพื้นที่สำหรับปรับให้เหมาะสมเช่นกัน (เช่นการยกเว้นสิ่งที่อยู่นอกจอเป็นเรื่องง่ายมาก)
สรุป:
- SVG น่าจะดีกว่าสำหรับแอพพลิเคชั่นและแอพที่มีไอเท็มไม่กี่รายการ (น้อยกว่า 1,000?
- Canvas จะดีกว่าสำหรับวัตถุหลายพันรายการและการจัดการอย่างระมัดระวัง แต่จำเป็นต้องใช้รหัสเพิ่มเติม (หรือไลบรารี) จำนวนมากเพื่อนำออกจากพื้น
- HTML Divs เป็น clunky และไม่ขยายทำให้เป็นวงกลมได้เฉพาะกับมุมโค้งมนทำให้รูปร่างที่ซับซ้อนเป็นไปได้ แต่เกี่ยวข้องกับ divs พิกเซลกว้างเล็ก ๆ หลายร้อยตัว ความบ้าคลั่งเกิดขึ้น