canvas粒子碰撞特效高性能关键在于结构化管理、轻量物理判断与内存友好更新:粒子需含radius/vx/vy/mass/isstatic属性;检测用平方距离、粗筛与空间分区优化;响应支持弹性/阻尼/粘连/穿透模式;数组须主动清理或对象池复用。

Canvas 实现高性能自定义粒子碰撞特效,关键不在“画得多”,而在“算得准、删得快、复用稳”。真正流畅的碰撞效果,依赖结构化粒子管理、轻量级物理判断和内存友好型更新逻辑,60fps 不是靠压榨渲染,而是靠规避常见陷阱。
粒子类必须带可配置物理属性
每个粒子不是静态点,而是具备独立运动规则的实体。碰撞行为由以下核心属性驱动:
- radius:用于圆形碰撞检测,必须参与距离计算,不能仅靠视觉 size 渲染
- vx、vy:速度分量,碰撞后需按法线方向反射,建议保留原始值便于后续叠加外力(如风、重力)
- mass:可选但推荐,用于实现质量加权的动量守恒反弹(小粒子撞大粒子时偏移更小)
- isStatic:标记边界墙或固定障碍物,避免参与双向更新,提升计算效率
碰撞检测要跳过开方、限频次、分层级
两两检测 O(n²) 是性能杀手,必须做三重约束:
- 用
(dx * dx + dy * dy) 替代 <code>Math.sqrt(dx*dx + dy*dy) ,省掉开方运算 - 只在粒子靠近时触发检测——例如先粗筛“x 距离
- 对大量粒子启用空间分区(如二维网格),每个粒子只与同格及相邻 8 格内粒子检测,大幅降低比较次数
碰撞响应要避免硬编码,支持多种模式
反弹不是只有“镜面反射”,应通过配置切换行为:
- 弹性碰撞:按标准动量公式更新 vx/vy,保留能量(适合模拟台球、弹珠)
-
阻尼反弹:每次碰撞后乘以
0.92类衰减系数,模拟真实摩擦(适合沙粒、软质粒子) - 粘连合并:当相对速度极低且半径比合适时,将小粒子吸收进大粒子,减少总数并触发尺寸/颜色变化
- 穿透忽略:对高速粒子启用“穿越检测”,若帧间位移大于两倍半径,则跳过该帧碰撞,防穿模
数组管理必须主动清理或对象池复用
粒子碰撞常伴随分裂、消失、重生,数组不能只增不减:
- 死亡粒子(如碰撞后 alpha ≤ 0 或 lifespan ≤ 0)必须从主数组中
splice()移除,或更优——用“游标+覆盖”方式标记无效项 - 高频创建销毁场景(如爆炸)推荐对象池:预分配 500 个粒子实例,碰撞产生新粒子时从池取,回收时重置属性归还,避免频繁 new/gc
- resize 或状态重置时,清空数组并重生成,同时重置所有粒子的 position 范围适配新 canvas 尺寸(含 devicePixelRatio)











