Seberapa cepat JavaScript? Simulasi 20 juta partikel
Tantangan
- Mensimulasikan 1.000.000 partikel pada 60fps di ponsel hanya dengan menggunakan CPU
Percobaan pertama
- Mensimulasikan partikel dengan JavaScript hanya menggunakan CPU tanpa GPU
- Array di JavaScript tidak selalu berupa array data yang kontigu
- Menggunakan TypedArray agar memori tetap kontigu
Implementasi pertama
- Menerapkan multithreading dengan Web Workers
- Berbagi memori dengan SharedArrayBuffer
- Menyimpan data partikel sebagai angka floating point 32-bit
- Merender setiap partikel sebagai piksel di layar menggunakan objek ImageData
Percobaan kedua
- Menambahkan interaksi dengan mengirim data input ke worker
- Menggunakan pendekatan gravitasi agar partikel tertarik ke titik sentuh di layar
Percobaan ketiga
- Membiarkan worker menggambar piksel agar semua inti CPU lebih termanfaatkan
- Mengharapkan peningkatan kecepatan lebih lanjut dengan konsekuensi penggunaan memori yang meningkat
Percobaan keempat
- Menggunakan messaging untuk sinkronisasi antar-thread hingga rendering selesai
- Menyelesaikan masalah flickering
Percobaan kelima
- Menggunakan double buffering agar worker dapat menyiapkan frame berikutnya selama rendering berlangsung
- Penggunaan memori meningkat
Percobaan keenam
- Menambahkan ide interaksi baru agar partikel kembali ke posisi awalnya
- Menambahkan 2 angka untuk menyimpan posisi awal partikel
Ringkasan GN⁺
- Artikel ini menjelaskan cara mengimplementasikan simulasi partikel skala besar dengan JavaScript
- Membahas cara memaksimalkan pemanfaatan performa CPU dengan TypedArray dan Web Workers
- Menekankan pentingnya multithreading dan manajemen memori
- Menunjukkan berbagai percobaan untuk meningkatkan interaktivitas simulasi partikel
- Proyek dengan fungsi serupa antara lain Three.js dan Babylon.js
1 komentar
Opini Hacker News
Mengusulkan untuk menyematkan simulasi langsung ke dalam blog
Menyebut bahwa simulasi partikel dapat dijalankan di GPU bahkan tanpa WebGPU
Menyebut bahwa demo di perangkat mobile sangat mengesankan
Bertanya apakah data partikel bisa dienkode sebagai satu angka JS
Mengajukan pertanyaan tentang Atomics API
Menyebut simulasi yang menangani hampir 20 juta partikel
Menyebut bahwa videonya keren, tetapi tautan CodeSandbox tidak berfungsi di desktop MacOS Chrome
Menyebut ingin menunjukkan performa cepat JS kepada tim UI
Berterima kasih atas engineering penulis yang luar biasa dan tulisan yang sangat bagus
Membagikan pengalaman melakukan eksperimen serupa yang menangani banyak partikel dengan simulasi fisika dasar
Menyebut bahwa chrome://tracing bisa memberikan insight yang lebih banyak