当前位置: 首页 > article >正文

从零解析:手写一个JavaScript粒子系统(附新年烟花完整源码)

从零构建JavaScript粒子引擎以新年烟花为例的实战开发指南每当节日庆典来临屏幕上绽放的数字烟花总能瞬间点燃欢乐氛围。这些看似复杂的视觉效果其核心往往是一个精心设计的粒子系统。本文将带你从零开始用JavaScript构建一个高性能的粒子引擎并以新年烟花为案例展示如何将基础理论转化为令人惊艳的交互体验。1. 粒子系统基础架构设计粒子系统的核心在于管理大量独立对象的生命周期。我们先从最基础的Particle类开始构建class Particle { constructor(x, y) { this.position { x, y }; // 二维坐标 this.velocity { x: (Math.random() - 0.5) * 4, y: (Math.random() - 0.5) * 4 }; this.radius Math.random() * 3 1; this.color hsl(${Math.random() * 360}, 100%, 50%); this.life 1.0; // 生命周期0-1 this.decay Math.random() * 0.02 0.01; // 衰减速率 } }关键属性设计原则物理模拟每个粒子应具备位置、速度、加速度等基本物理属性视觉表现包含大小、颜色、透明度等渲染相关参数生命周期通过衰减机制实现粒子的自然消失随机性所有参数都应包含随机因子增强自然感提示使用HSL色彩空间可以轻松生成鲜艳的随机颜色特别适合烟花等视觉效果。2. 粒子引擎核心逻辑实现2.1 粒子更新与渲染系统建立好粒子基础结构后我们需要实现引擎的核心循环class ParticleEngine { constructor(canvas) { this.particles []; this.ctx canvas.getContext(2d); this.width canvas.width; this.height canvas.height; } update() { this.particles this.particles.filter(p { p.life - p.decay; p.position.x p.velocity.x; p.position.y p.velocity.y; return p.life 0; }); } render() { this.ctx.clearRect(0, 0, this.width, this.height); this.particles.forEach(p { this.ctx.globalAlpha p.life; this.ctx.fillStyle p.color; this.ctx.beginPath(); this.ctx.arc(p.position.x, p.position.y, p.radius, 0, Math.PI * 2); this.ctx.fill(); }); } animate() { this.update(); this.render(); requestAnimationFrame(() this.animate()); } }2.2 性能优化策略当粒子数量超过1000时性能优化变得至关重要优化技术实现方式性能提升对象池复用已销毁的粒子对象减少GC压力空间分区按区域管理粒子降低计算复杂度批量渲染使用WebGL或离屏canvas减少绘制调用距离剔除忽略屏幕外粒子节省计算资源// 对象池实现示例 class ParticlePool { constructor(size) { this.pool Array(size).fill().map(() new Particle()); this.index 0; } get(x, y) { const particle this.pool[this.index]; particle.position {x, y}; particle.life 1.0; this.index (this.index 1) % this.pool.length; return particle; } }3. 烟花特效的物理模拟真实的烟花效果需要更复杂的物理模拟。我们引入重力、空气阻力和爆炸力class FireworkParticle extends Particle { constructor(x, y) { super(x, y); this.velocity { x: (Math.random() - 0.5) * 8, y: (Math.random() - 0.5) * 8 - 2 // 初始向上速度 }; this.gravity 0.05; this.drag 0.99; } update() { this.velocity.y this.gravity; this.velocity.x * this.drag; this.velocity.y * this.drag; super.update(); } }多阶段烟花效果实现发射阶段单个粒子垂直上升爆炸阶段生成大量子粒子向四周扩散衰减阶段粒子受重力下落并逐渐消失余烬效果添加二次爆炸或闪烁效果4. 引擎扩展与效果定制4.1 效果预设系统通过配置对象实现不同视觉效果const effects { fireworks: { count: 150, gravity: 0.05, explosionForce: 8, colorRange: [0, 360] }, snow: { count: 200, gravity: 0.01, drift: 0.5, colorRange: [200, 240] } }; function createEffect(type, x, y) { const config effects[type]; return Array(config.count).fill().map(() { const particle new Particle(x, y); // 应用配置参数... return particle; }); }4.2 粒子行为插件系统通过策略模式实现可扩展的行为系统const behaviors { gravity: (p, value) { p.velocity.y value }, wind: (p, value) { p.velocity.x value }, fade: (p) { p.radius * 0.99 } }; class SmartParticle extends Particle { constructor(x, y, behaviorList) { super(x, y); this.behaviors behaviorList; } update() { this.behaviors.forEach(behavior behaviors[behavior](this)); super.update(); } }5. 实战完整新年特效页面集成将粒子系统与传统DOM元素结合创造丰富的节日场景class HolidayScene { constructor() { this.canvas document.getElementById(fireworks); this.engine new ParticleEngine(this.canvas); this.setupBackground(); this.setupInteractivity(); } setupBackground() { // 创建星空背景 const stars new Array(200).fill().forEach(() { const star document.createElement(div); star.className star; // 设置随机位置和动画 document.body.appendChild(star); }); } setupInteractivity() { // 点击触发烟花 this.canvas.addEventListener(click, (e) { this.engine.particles.push(...createFirework(e.clientX, e.clientY)); }); // 自动发射烟花 setInterval(() { const x Math.random() * this.canvas.width; const y Math.random() * this.canvas.height * 0.5; this.engine.particles.push(...createFirework(x, y)); }, 1000); } }性能对比测试粒子数量基础实现(FPS)优化后(FPS)50045601000225520008405000225在实现粒子系统时最容易被忽视的是内存管理。当需要创建大量粒子时务必使用对象池技术避免频繁的内存分配和垃圾回收。我在一个项目中曾因忽略这点导致移动端设备频繁卡顿后来通过预分配5000个粒子的对象池解决了性能问题。

相关文章:

从零解析:手写一个JavaScript粒子系统(附新年烟花完整源码)

从零构建JavaScript粒子引擎:以新年烟花为例的实战开发指南 每当节日庆典来临,屏幕上绽放的数字烟花总能瞬间点燃欢乐氛围。这些看似复杂的视觉效果,其核心往往是一个精心设计的粒子系统。本文将带你从零开始,用JavaScript构建一个…...

用STM32CubeMX配置DP83848踩过的坑:从SMI通信失败到Ping成功的完整避坑指南

STM32CubeMX配置DP83848全流程避坑指南:从硬件排查到网络调试 最近在基于STM32F407和DP83848设计工业通信网关时,发现网络模块调试远比想象中复杂。即使使用STM32CubeMX这样的可视化配置工具,PHY芯片的初始化、RMII接口配置、SMI通信等环节依…...

三相不平衡电压下I型NPC三电平并网逆变器并网控制 1.采用正负序分离锁相环以及正序PI控制...

三相不平衡电压下I型NPC三电平并网逆变器并网控制 1.采用正负序分离锁相环以及正序PI控制,负序PI控制 2.采用中点电位平衡控制-零序电压注入法 3.采用SVPWM羊角波调制方式 4.提供参考文献 提供仿真源文件,电流环参数设计,正负序分离方法详解&…...

ARK服务器创世地图开服指南:如何用Mod和集群设置打造百倍资源专属服

ARK创世地图高阶开服指南:Mod集群与百倍资源调优实战 在ARK: Survival Evolved的私服生态中,创世地图因其独特的生物群落和任务系统成为进阶服主的热门选择。当基础搭建已不再是障碍,如何通过精细化Mod管理、跨地图数据集群和资源倍率调校打造…...

避坑指南:Seurat单细胞分析中,数据标准化(LogNormalize vs SCTransform)与PC数选择到底怎么选?

Seurat单细胞分析标准化方法与PC数选择的科学决策指南 1. 标准化方法的选择困境与解决方案 在单细胞RNA测序数据分析中,数据标准化是影响后续分析结果的关键步骤。Seurat提供了两种主流标准化方法:LogNormalize和SCTransform,它们各有特点&am…...

HTML常用布局详解:从基础到进阶的网页结构指南

在网页开发中,HTML布局是构建页面骨架的基础。合理的布局不仅能提升代码可维护性,还能直接影响用户体验和SEO效果。本文将系统梳理HTML中常用的布局方式,从传统表格布局到现代CSS布局技术,助你掌握网页结构设计的核心方法。 一、传…...

Qwen3-32B大模型企业级部署案例:基于优化镜像的API服务封装实践

Qwen3-32B大模型企业级部署案例:基于优化镜像的API服务封装实践 1. 企业级部署需求分析 在当今企业智能化转型过程中,大型语言模型的私有化部署需求日益增长。Qwen3-32B作为一款性能优异的中英双语大模型,在企业知识管理、智能客服、内容生…...

本地部署EmbeddingGemma-300m:Ollama让语义理解触手可及

本地部署EmbeddingGemma-300m:Ollama让语义理解触手可及 1. 为什么选择EmbeddingGemma-300m 在当今AI应用蓬勃发展的时代,文本嵌入技术已成为各类智能系统的核心组件。然而,大多数嵌入模型要么体积庞大、依赖高端硬件,要么性能不…...

Qwen3.5-9B开源大模型部署:Kubernetes集群化部署与自动扩缩容实践

Qwen3.5-9B开源大模型部署:Kubernetes集群化部署与自动扩缩容实践 1. 模型概述与技术特性 Qwen3.5-9B是通义千问团队推出的新一代开源大语言模型,在多项基准测试中展现出超越前代产品的性能表现。该模型采用创新的混合架构设计,特别适合企业…...

Python高效处理CLDAS-V2.0气象数据的NetCDF文件实战

1. 认识CLDAS-V2.0气象数据与NetCDF格式 第一次接触气象数据时,我被各种专业术语搞得晕头转向。直到用Python处理了CLDAS-V2.0数据集后,才发现气象数据可以这么有趣。CLDAS-V2.0是中国气象局发布的陆面数据同化系统产品,包含温度、降水、湿度…...

自动驾驶控制模块状态机的安全机制与实现策略

1. 自动驾驶控制模块状态机的核心安全机制 自动驾驶系统的可靠性直接关系到人身安全,而状态机作为控制模块的"大脑",其安全设计尤为重要。在实际项目中,我见过太多因为状态机设计缺陷导致的意外情况。比如某次路测中,车…...

Python 3.9环境下dlib库安装全攻略:从依赖配置到离线安装(附国内镜像源)

Python 3.9环境下dlib库高效安装指南:避坑实践与性能优化 在计算机视觉和机器学习领域,dlib库以其强大的人脸识别和特征检测功能而闻名。然而,许多开发者在Python 3.9环境下安装dlib时,往往会遇到各种棘手的依赖问题和编译错误。…...

告别纯CNN!用UNETR搞定三维医学图像分割:保姆级PyTorch+MONAI复现教程

UNETR三维医学图像分割实战:从PyTorch数据加载到MONAI模型部署全解析 医学影像分析领域正经历一场从传统CNN到Transformer架构的范式转移。当我们在处理CT、MRI这类三维体数据时,如何平衡全局上下文理解与局部特征提取成为模型设计的核心挑战。本文将带您…...

Guohua Diffusion 模型压缩与加速实践:在边缘设备上的部署尝试

Guohua Diffusion 模型压缩与加速实践:在边缘设备上的部署尝试 最近在折腾一个挺有意思的事儿,就是想把一个挺大的图像生成模型,塞到咱们平时用的笔记本电脑里跑起来。这事儿听起来有点异想天开,毕竟这类模型动辄几十个G&#xf…...

为什么90%的MCP跨语言调用会偶发“UnknownError: code=12”?——基于Wireshark+eBPF的协议栈级深度溯源

第一章:MCP跨语言调用中“UnknownError: code12”的本质定义与协议语义边界“UnknownError: code12”并非通用错误码,而是 MCP(Microservice Communication Protocol)在跨语言 RPC 调用中定义的**协议层语义越界错误**&#xff0c…...

2025 年实战指南:基于大模型与 Flink 的实时多模态异常检测系统构建

1. 为什么需要实时多模态异常检测系统 想象一下你正在管理一个大型工业园区的设备监控系统。每天有上千个摄像头拍摄设备运行状态,数万个传感器采集温度、振动等数据,还有源源不断的维修日志和操作记录。传统的人工巡检方式就像用放大镜在沙滩上找一粒特…...

双机并联自适应虚拟阻抗下垂控制MATLAB仿真模型:涵盖电压电流双环控制与锁相环技术的全面研究方案

双机并联自适应虚拟阻抗下垂控制(droop)MATLAB仿真模型 标价即原价 下垂控制 电压电流双环控制 锁相环 有参考文献 …… 模块完整,运行曲线完美,适合作为基础模型 MATLAB2018b及以上版本。下垂控制这玩意儿在微电网里就像班长分配值日任务——谁活多谁就…...

局部遮阴光伏MPPT仿真:粒子群算法详解及video explanation指引

局部遮阴光伏MPPT仿真-粒子群算法,有 video explanation光伏阵列在局部遮阴条件下会出现多峰特性,传统MPPT算法容易陷入局部最优。这时候就该粒子群算法(PSO)登场了——这种群体智能算法最适合在这种崎岖的功率曲线上玩冲浪。先看…...

PFC裂纹密度图、云图及裂缝密度云图

pfc 裂纹密度图,云图,裂缝密度云图。屏幕上的红色斑块像病毒一样扩散开来,我盯着PFC模拟结果里那些张牙舞爪的裂缝,突然意识到该给这些抽象数据找个直观的呈现方式了。裂纹密度云图就是个好选择——它能让我们像看天气图那样&…...

基于Python的篮球联盟管理系统毕设

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于Python的篮球联盟管理系统,以提升篮球联盟的管理效率和服务质量。具体研究目的如下:提高篮球联盟管理效率&…...

基于Python的物流管理系统毕业设计

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在开发一套基于Python的物流管理系统,以实现物流过程的自动化、智能化和高效化。具体研究目的如下:提高物流管理效率&#xff1a…...

基于Python的垃圾分类回收系统毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于Python的垃圾分类回收系统,以解决当前我国城市生活垃圾处理中的分类回收难题。具体研究目的如下:提高垃圾分…...

基于Python的喀什旅游网站毕业设计

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在通过开发基于Python的喀什旅游网站,实现以下研究目的: 首先,本研究旨在构建一个功能完善、界面友好的喀什旅游网站…...

基于Python的商品推荐系统毕业设计源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于Python的商品推荐系统,以实现个性化推荐功能,提高用户满意度与购物体验。具体研究目的如下: 首先&…...

Power BI(二十四)power pivot之优化多对多关系计算性能

1. 多对多关系的本质与挑战 在Power BI中处理多对多关系就像在图书馆整理书籍:一个读者可以借阅多本书,而同一本书也可能被多位读者借阅过。这种双向的"多对多"关系在实际业务场景中非常常见,比如: 学生与课程&#xff…...

PX4无人机仿真环境搭建避坑指南:从Ubuntu 22.04到ROS2 Humble的实战解析

1. 环境准备:Ubuntu 22.04基础配置 在开始PX4仿真环境搭建之前,确保你的Ubuntu 22.04系统已经完成基础配置。我遇到过不少因为系统环境不干净导致的奇怪问题,所以建议先执行以下操作: 首先更新软件源并升级现有包,这个…...

Java Web开发基础与Servlet核心技术

Java Web开发基础 Java Web开发是构建动态网站和Web应用程序的核心技术之一。基于Java EE(现为Jakarta EE)平台,开发者可以利用Servlet、JSP等技术处理HTTP请求和响应。以下是关键基础概念: HTTP协议:Web开发基于HTT…...

手把手教你用OpenCV实现张正友相机标定(附Python代码)

从零掌握OpenCV相机标定:张正友法的Python实战指南 在计算机视觉领域,相机标定是构建三维感知系统的基石。无论是工业检测、自动驾驶还是增强现实应用,精确的相机参数都是实现空间测量的前提。本文将带您用Python和OpenCV一步步实现经典的张正…...

从热力图到伪彩图:手把手教你用Matlab imagesc处理并可视化你的实验数据矩阵

从热力图到伪彩图:手把手教你用Matlab imagesc处理并可视化你的实验数据矩阵 在材料科学实验室里,张博士正盯着电脑屏幕上一堆密密麻麻的数字——这是她最新一批合金样品在不同温度下的热导率测量数据。这些数字本应揭示材料性能的分布规律,但…...

避坑指南:CNN-LSTM模型在数据回归预测中的5个常见错误及解决方案

CNN-LSTM模型在数据回归预测中的5个致命陷阱与实战解决方案 当你第一次将CNN-LSTM模型应用于时间序列预测时,是否遇到过这样的场景:模型在训练集上表现完美,却在测试集上一塌糊涂?或者训练过程中损失值像过山车一样剧烈波动&#…...