canvas粒子爆发与消散效果的关键在于符合视觉直觉的物理模型:爆发阶段用高斯分布初速度、水平倾向角度、首帧加速度+持续重力/阻力;消散阶段同步衰减透明度、平方缩小尺寸、三段插值颜色;分主爆、拖尾、闪光三层粒子;通过活动池管理提升性能。

Canvas实现粒子爆发与消散效果,关键不在画得多炫,而在于粒子行为是否符合视觉直觉:爆发要有力道感,消散要有余韵。核心是用一套轻量但可控的物理模型驱动每个粒子,再辅以时间轴一致的衰减逻辑。
爆发阶段:模拟瞬时能量释放
粒子不是均匀喷射,而是从中心点高速向外飞散,方向和速度需带自然随机性:
- 初速度按高斯分布生成(例如:用
Math.random() + Math.random()替代单纯Math.random()),让多数粒子集中在中等速度区间,少量极快或较慢,避免“圆饼式”呆板扩散 - 角度不取全范围
[0, 2π],而是偏重水平方向(如 ±45° 内概率提升),增强横向张力,更接近真实爆炸的惯性倾向 - 初始加速度仅在首帧施加,之后交由重力(
ay = 0.03–0.07)和阻力(vx *= 0.97; vy *= 0.96)持续作用,形成抛物线+减速轨迹
消散阶段:多维渐变强化时间感知
粒子消失不能只是“突然不见”,而应通过同步变化的多个属性传递生命周期信息:
- 透明度(
ctx.globalAlpha)按life / maxLife线性衰减,确保淡出自然 - 尺寸同步缩小,公式为
size * (life / maxLife)²(平方衰减比线性更快,突出末期收缩感) - 颜色可做三段插值:起始亮白(
#fff)→ 中段暖橙(#ff9a3d)→ 末端灰黑(#333),避免全程单色导致层次扁平
分层设计提升视觉厚度
单一层粒子容易显得单薄,建议按功能拆分为三组,共用同一时间戳更新:
- 主爆粒子(80–120个):速度高、寿命中等(80–100帧)、颜色偏黄白,构成爆发主体
-
拖尾粒子(20–40个):初速略低、阻力系数更小(如
*= 0.99)、延迟5–10帧生成,模拟高温残渣缓慢沉降 - 闪光粒子(5–8个):半径大、alpha 固定为 0.9、寿命极短(15–25帧),只在爆发首帧绘制,强化“爆点”冲击
性能可控的粒子管理
大量粒子持续运算易掉帧,需主动控制活跃数量:
- 维护一个「活动粒子池」数组,只遍历
life > 0的粒子;移除时用splice(i, 1)或更优的「对象池复用」策略 - 超出画布下边界(
y > canvas.height + 100)或左侧过远(x )立即剔除,避免无效计算 - 关闭抗锯齿:
ctx.imageSmoothingEnabled = false,对圆形粒子影响极小,但绘制速度提升明显 - 动画循环必须用
requestAnimationFrame,禁用setInterval,防止帧率波动导致运动撕裂











