JavaScript เร็วได้แค่ไหน? การจำลองอนุภาค 20 ล้านตัว
โจทย์ท้าทาย
- จำลองอนุภาค 1,000,000 ตัวที่ 60fps บนโทรศัพท์มือถือโดยใช้เฉพาะ CPU
ความพยายามครั้งแรก
- จำลองอนุภาคด้วย JavaScript โดยไม่ใช้ GPU และใช้เฉพาะ CPU
- อาร์เรย์ของ JavaScript ไม่ได้เป็นอาร์เรย์ข้อมูลที่ต่อเนื่องกันเสมอไป
- ใช้ TypedArray เพื่อให้หน่วยความจำคงความต่อเนื่อง
การติดตั้งใช้งานครั้งแรก
- ใช้ Web Workers เพื่อทำมัลติเธรดดิ้ง
- ใช้ SharedArrayBuffer เพื่อแชร์หน่วยความจำ
- จัดเก็บข้อมูลอนุภาคเป็นตัวเลขทศนิยม 32 บิต
- ใช้อ็อบเจ็กต์ ImageData เพื่อเรนเดอร์อนุภาคแต่ละตัวเป็นพิกเซลบนหน้าจอ
ความพยายามครั้งที่สอง
- ส่งข้อมูลอินพุตไปยังเวิร์กเกอร์เพื่อเพิ่มการโต้ตอบ
- ใช้การประมาณแรงโน้มถ่วงเพื่อให้อณุภาคถูกดึงเข้าหาจุดสัมผัสบนหน้าจอ
ความพยายามครั้งที่สาม
- ให้เวิร์กเกอร์วาดพิกเซลเองเพื่อใช้ทุกคอร์ของ CPU ได้มากขึ้น
- ยอมรับการใช้หน่วยความจำที่เพิ่มขึ้นและคาดหวังการเพิ่มความเร็วมากขึ้น
ความพยายามครั้งที่สี่
- ใช้การส่งข้อความเพื่อซิงโครไนซ์ระหว่างเธรดจนกว่าการเรนเดอร์จะเสร็จสิ้น
- แก้ปัญหา flickering
ความพยายามครั้งที่ห้า
- ใช้ double buffering เพื่อให้เวิร์กเกอร์เตรียมเฟรมถัดไปได้ระหว่างการเรนเดอร์
- การใช้หน่วยความจำเพิ่มขึ้น
ความพยายามครั้งที่หก
- เพิ่มไอเดียการโต้ตอบแบบใหม่ที่ทำให้อณุภาคกลับไปยังตำแหน่งเริ่มต้น
- เพิ่มตัวเลข 2 ค่าเพื่อเก็บตำแหน่งเริ่มต้นของอนุภาค
สรุปโดย GN⁺
- บทความนี้อธิบายวิธีสร้างการจำลองอนุภาคขนาดใหญ่ด้วย JavaScript
- กล่าวถึงวิธีใช้ TypedArray และ Web Workers เพื่อดึงประสิทธิภาพของ CPU ออกมาให้มากที่สุด
- เน้นย้ำความสำคัญของมัลติเธรดดิ้งและการจัดการหน่วยความจำ
- แสดงให้เห็นความพยายามหลากหลายแบบเพื่อเพิ่มความสามารถในการโต้ตอบของการจำลองอนุภาค
- โปรเจ็กต์ที่มีฟังก์ชันคล้ายกัน ได้แก่ Three.js และ Babylon.js
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีการเสนอให้ฝังการจำลองไว้ในบล็อกโดยตรง
กล่าวว่าสามารถรันการจำลองอนุภาคบน GPU ได้แม้ไม่มี WebGPU
กล่าวว่าตัวเดโมบนมือถือสร้างความประทับใจอย่างมาก
ตั้งคำถามว่าสามารถเข้ารหัสข้อมูลอนุภาคเป็นตัวเลข JS เดียวได้หรือไม่
มีการตั้งคำถามเกี่ยวกับ Atomics API
กล่าวถึงการจำลองที่จัดการอนุภาคได้เกือบ 20 ล้านตัว
กล่าวว่าวิดีโอนั้นยอดเยี่ยม แต่ลิงก์ CodeSandbox ใช้งานไม่ได้บน MacOS Chrome เดสก์ท็อป
กล่าวว่าอยากแสดงให้ทีม UI เห็นว่า JS ทำงานได้เร็วแค่ไหน
ขอบคุณผู้เขียนสำหรับวิศวกรรมที่ยอดเยี่ยมและงานเขียนที่ดีมาก
แชร์ประสบการณ์จากการทดลองคล้ายกันที่ประมวลผลอนุภาคจำนวนมากด้วยการจำลองฟิสิกส์พื้นฐาน
กล่าวถึงว่า chrome://tracing อาจให้ข้อมูลเชิงลึกได้มากกว่า