Quelle est la rapidité de JavaScript ? Simulation de 20 millions de particules
Défi
- Simuler 1 000 000 de particules à 60 fps sur un téléphone en utilisant uniquement le CPU
Première tentative
- Simulation de particules en JavaScript en utilisant uniquement le CPU, sans GPU
- Les tableaux JavaScript ne sont pas toujours des tableaux de données contigus
- Utilisation de
TypedArray pour conserver une mémoire contiguë
Première implémentation
- Mise en place du multithreading avec
Web Workers
- Utilisation de
SharedArrayBuffer pour partager la mémoire
- Stockage des données des particules sous forme de nombres flottants 32 bits
- Utilisation de l’objet
ImageData pour afficher chaque particule comme un pixel à l’écran
Deuxième tentative
- Ajout de l’interactivité en transmettant les données d’entrée aux workers
- Utilisation d’une approximation de la gravité pour attirer les particules vers les points de contact à l’écran
Troisième tentative
- Faire dessiner les pixels par les workers afin d’utiliser davantage tous les cœurs CPU
- Pari sur un gain de vitesse plus important au prix d’une hausse de l’utilisation mémoire
Quatrième tentative
- Utilisation de messages pour synchroniser les threads jusqu’à la fin du rendu
- Résolution du problème de scintillement
Cinquième tentative
- Utilisation du double buffering pour permettre aux workers de préparer l’image suivante pendant le rendu
- Augmentation de l’utilisation mémoire
Sixième tentative
- Ajout d’une nouvelle idée d’interaction pour que les particules reviennent à leur position initiale
- Ajout de 2 nombres pour stocker la position de départ des particules
Résumé de GN⁺
- Cet article explique comment implémenter une simulation de particules à grande échelle en JavaScript
- Il montre comment exploiter au maximum les performances CPU avec
TypedArray et Web Workers
- Il souligne l’importance du multithreading et de la gestion mémoire
- Il présente plusieurs essais pour renforcer l’interactivité de la simulation de particules
- Parmi les projets aux fonctionnalités similaires, on trouve Three.js et Babylon.js
1 commentaires
Avis Hacker News
Proposition d’intégrer directement la simulation dans le billet de blog
Mention qu’il est possible d’exécuter une simulation de particules sur le GPU même sans WebGPU
Mention que la démo sur mobile est très impressionnante
Question sur la possibilité d’encoder les données des particules dans un seul nombre JS
MAX_SAFE_INTEGERde JSQuestion soulevée au sujet de l’API Atomics
waitAsync, elle n’utilise pas de promessesMention d’une simulation traitant près de 20 millions de particules
Mention que la vidéo est sympa, mais que le lien CodeSandbox ne fonctionne pas sur Chrome desktop sous macOS
SharedArrayBuffernon définie et erreur CORS rencontréesMention de l’envie de montrer à l’équipe UI les performances rapides de JS
Remerciements pour l’excellent travail d’ingénierie de l’auteur et la qualité du texte
Partage d’une expérience similaire ayant permis de gérer beaucoup de particules avec une simulation physique de base
Mention que chrome://tracing pourrait fournir davantage d’insights