轨道模型:重叠从哪里来
滚动弹幕 (scrolling / rolling comment) 从屏幕右缘进入、匀速向左飞出。若任由每条弹幕落在任意纵向位置,高峰期它们就会在垂直方向相互压字、糊成一团。业界的通用做法是先把屏幕横向切成若干条等高的轨道 (track / lane),弹幕只能落在某条轨道上;重叠问题随即收敛为「同一轨道内,后一条会不会追尾前一条」——一个可精确判定的一维问题。本页让你直接对照无轨道吸附与轨道吸附 + first-fit两种排布。
关掉轨道吸附:新弹幕随机落在任意高度,密集时频繁压字;打开后每条弹幕被吸附到某条空闲轨道,画面立刻清爽。打开显示轨道可看见被切出的等高轨道线。轨道高度 = 弹幕行高,这是整套排布的基本单位。
1 · 为什么「切轨道」是对的:把二维重叠降为一维追尾
不吸附时,两条弹幕是否重叠取决于纵向间距 + 横向间距两个维度,且每条弹幕的纵向位置连续可变,判定与回避都很笨重。一旦规定「弹幕只能落在离散的轨道上」,不同轨道的弹幕纵向永不相交,于是只剩同轨道内的横向追尾要管。轨道之间相互独立,可以各自维护状态、并行决策——这正是它成为事实标准的原因。
轨道高度 = 行高。轨道数 = ⌊屏高 / 行高⌋,通常再留出顶部 / 底部若干轨道给固定弹幕 (top / bottom)。固定弹幕停在原地几秒,占用的是「某轨道的一段时间区间」,判定比滚动弹幕更简单;本系列聚焦更难的滚动弹幕。
2 · 下一步
轨道有了,真正的核心是**「新弹幕该进哪条轨道、何时进才不追尾」。等速场景的判定异常简洁——见等速弹幕:入场只看间距;若让每条弹幕停留时长一致**(宽的飞得快),就要解追及不等式;而当所有轨道都占满,则进入选轨与降级。