JavaScript nhanh đến mức nào? Mô phỏng 20 triệu hạt
Thử thách
- Mô phỏng 1.000.000 hạt ở 60fps chỉ bằng CPU trên điện thoại
Lần thử đầu tiên
- Mô phỏng hạt bằng JavaScript chỉ với CPU, không dùng GPU
- Mảng của JavaScript không phải lúc nào cũng là mảng dữ liệu liên tục
- Dùng TypedArray để giữ bộ nhớ ở dạng liên tục
Triển khai đầu tiên
- Triển khai đa luồng bằng Web Workers
- Dùng SharedArrayBuffer để chia sẻ bộ nhớ
- Lưu dữ liệu hạt dưới dạng số thực dấu phẩy động 32-bit
- Dùng đối tượng ImageData để render từng hạt thành pixel trên màn hình
Lần thử thứ hai
- Truyền dữ liệu đầu vào cho worker để bổ sung khả năng tương tác
- Dùng phép xấp xỉ trọng lực để các hạt bị hút về điểm chạm trên màn hình
Lần thử thứ ba
- Cho worker vẽ pixel để tận dụng nhiều hơn tất cả các lõi CPU
- Chấp nhận tăng mức sử dụng bộ nhớ để kỳ vọng cải thiện thêm tốc độ
Lần thử thứ tư
- Dùng messaging để đồng bộ giữa các luồng cho đến khi render xong
- Giải quyết vấn đề flickering
Lần thử thứ năm
- Dùng double buffering để worker có thể chuẩn bị khung hình tiếp theo trong khi đang render
- Tăng mức sử dụng bộ nhớ
Lần thử thứ sáu
- Bổ sung một ý tưởng tương tác mới để các hạt quay về vị trí ban đầu
- Thêm 2 số để lưu vị trí ban đầu của hạt
Tóm tắt của GN⁺
- Bài viết này giải thích cách triển khai mô phỏng hạt quy mô lớn bằng JavaScript
- Trình bày cách tận dụng tối đa hiệu năng CPU bằng TypedArray và Web Workers
- Nhấn mạnh tầm quan trọng của đa luồng và quản lý bộ nhớ
- Cho thấy nhiều thử nghiệm khác nhau để tăng tính tương tác của mô phỏng hạt
- Các dự án có tính năng tương tự gồm có Three.js và Babylon.js
1 bình luận
Ý kiến Hacker News
Đề xuất nhúng trực tiếp mô phỏng vào bài blog
Nhắc rằng vẫn có thể chạy mô phỏng hạt trên GPU ngay cả khi không có WebGPU
Nhắc rằng bản demo trên di động rất ấn tượng
Hỏi liệu có thể mã hóa dữ liệu hạt thành một số JS duy nhất hay không
Đặt câu hỏi về Atomics API
Nhắc đến một mô phỏng xử lý gần 20 triệu hạt
Nhắc rằng video rất tuyệt nhưng liên kết CodeSandbox không hoạt động trên Chrome desktop của MacOS
Nhắc rằng muốn cho đội UI thấy hiệu năng nhanh của JS
Cảm ơn kỹ thuật xuất sắc và bài viết tuyệt vời của tác giả
Chia sẻ trải nghiệm từng làm thí nghiệm tương tự để xử lý rất nhiều hạt bằng mô phỏng vật lý cơ bản
Nhắc rằng chrome://tracing có thể mang lại thêm nhiều insight