刚好看了github上面西瓜视频的弹幕系统设计,趁机总结下。弹幕系统用的都是类似飞机场的航道设计,根据字体大小,把屏幕分成多个航道channel,弹幕字体小于一个航道高度的,归属于一个航道,而弹幕字体大于一个航道高度的,就使用多个航道进行发送,把不规律归并成规律。
在载入弹幕数据时,先根据当前播放时间,载入前后时间段对应的字幕 ,过滤并按照时间先后顺序得到字幕数据之后,开始根据字幕数据载入。在给字幕计算轨道时,遍历从头开始遍历所有的轨道,根据字幕的大小计算需要的轨道数,在需要占领的轨道数中的轨道,若果这些轨道的上一个弹幕的速率小于当前弹幕速率和剩余所需时间大于当前弹幕所需时间,则该轨道不适合,为什么要这样做呢?这样能保证当前弹幕在X轴和Y轴都不会和之前的弹幕重叠。经过这么一轮遍历,就能为弹幕找到合适的坑位了。
航道的设计的巧妙,在于保证了y轴上弹幕不会重叠,而上一步的计算,能保证x轴弹幕不会重叠。