目前主流的视频网站均支持了弹幕功能,调研了一下移动端弹幕实现的主要方向,B站貌似提供了DanmakuFlame框架,但不知道为什么我在Github上没有找到对应的iOS版本。
我在Github上查看到的最全面的框架是:BarrageRenderer
我在开发自己的弹幕框架时有些标准参考了这个框架,最终进行性能对比的测试也是与这个框架进行了对比。虽然这个框架的完成度已经比较高了,但我认为还有一些值得优化的点。
框架的主要构成
-
目前主流的实现一般采用 播放器->轨道->弹幕 这样的三层结构划分弹幕框架,使用时将弹幕信息传入播放器,播放器分配轨道,轨道播放弹幕。
-
在我自己的实现中增加了几个部件,这个结构变成了:播放器->轨道组->分发器->轨道控制器->轨道->弹幕。
-
新增了轨道组、分发器、轨道控制器三个角色来提供更多样丰富的功能。
技术选择
根据我的调研结果,iOS端目前实现弹幕的动画手段有UIViewAnimation和CADisplayLink两种,根据我个人的主观意志对比一下优劣:
A.UIViewAnimation:
优点:
1.调用简单,直接规定初末状态就可以实现。
2.据说CoreAnimation执行的效率比直接使用CADisplayLink要好(我自己没有证实过)。
缺点:
1.无法规定弹幕轨迹,对弹幕运动的细节缺少控制,因此这种实现方式能实现的弹幕形态比较单一。
2.貌似只有UIView会有animatedWith接口,不能使用CALayer,这可能会导致它的性能瓶颈比CADisplayLink略低一些(这个与优点的2不冲突,优点2的对比条件应该是两种都使用UIView做动画)。
3.如果你希望视频暂停是弹幕停在屏幕中不动,UIViewAnimation可能做不到。
B.CADisplayLink
优点:
1.可以定义弹幕动画的任意一处细节,同样是从A点移动到B点,CADisplayLink可以定义曲线,而UIViewAnimation只能定义直线(也可能有方法我不知道)。
2.CADisplayLink不依赖UI组件,所以弹幕的变化可以不局限于UI变化,甚至可以在变化中不断更换Model或者文案。
缺点:
1.实现起来确实没有UIAnimationView容易。
总之,UIViewAnimation是一套快捷简便的方案,但支持的弹幕种类、弹幕控制方面有一定局限;CADisplayLink则必定伴随一套大而全的弹幕机制,其提供的回报也是丰富的,我们可以精准控制到弹幕播放中的每一处细节。
结论:不论使用哪种方式,表现给使用者的便捷性和拓展性都应当是一致的,所择CAdisplayLink来实现能提供能丰富的功能,至于实现复杂性,Frame就是为了解决这些复杂性存在的。
附上自身实现的一个弹幕组件:
LNDanmakuMaster
网友评论