等速弹幕:入场只看间距
先看最简单也最常用的策略:所有弹幕同一速度 v 向左滚动。等速有一个关键性质——两条同轨道的弹幕,只要进场那一刻不重叠,之后间距恒定、永远不会追尾。于是「新弹幕能否进某条轨道」退化为一次性的入场判定:该轨道最后一条弹幕的右端是否已经全部进入屏幕(右端 ,W 为屏宽)。若已进场,新弹幕从右缘跟上时必不重叠。
下一步 ▸ 逐条弹幕进场,自上而下扫描轨道 (first-fit)。屏幕里探出右缘的弹幕,其尾部尚未进场,该轨被占用(红);完全在屏内的,该轨可用(绿)。看代码行同步高亮判定条件。末尾会遇到「四轨皆满」,引出降级策略。
1 · 为什么等速下「进场不撞」就一劳永逸
设前一条弹幕宽 、后一条 ,二者同速 v。后一条从右缘进入时,若前一条右端已在屏内(右端 ≤ W),两条之间存在非负的水平间距;此后两条以相同速度左移,间距不增不减,所以一旦进场不撞,全程不撞。判定因此只需在进场瞬间做一次,无需逐帧碰撞检测——每条轨道只用记住「最后一条弹幕的右端位置」,决策是 。这正是直播弹幕高并发下的主流实现。
工程上常不取「右端恰好 = W」的临界,而留一点安全间距 (gap):把判定放宽成 ,让相邻弹幕之间始终有缝,观感更舒展。等速模型里改一个常数即可。
2 · 它的边界:等速换来简单,牺牲了什么
等速的代价是长短弹幕停留时长不同:短弹幕走 W + w 的路程更短、更早离场,长弹幕停留更久。若产品希望每条弹幕停留时长一致(长的看起来飞得快),就得让速度随宽度变化——这会重新引入追尾的可能,判定升级为追及不等式。而当某刻所有轨道都被占用,无论等速变速都要做降级取舍。