目前主流的視頻網(wǎng)站均支持了彈幕功能,調(diào)研了一下移動端彈幕實現(xiàn)的主要方向,B站貌似提供了DanmakuFlame框架,但不知道為什么我在Github上沒有找到對應的iOS版本。
我在Github上查看到的最全面的框架是:BarrageRenderer
我在開發(fā)自己的彈幕框架時有些標準參考了這個框架,最終進行性能對比的測試也是與這個框架進行了對比。雖然這個框架的完成度已經(jīng)比較高了,但我認為還有一些值得優(yōu)化的點。
框架的主要構(gòu)成
目前主流的實現(xiàn)一般采用 播放器->軌道->彈幕 這樣的三層結(jié)構(gòu)劃分彈幕框架,使用時將彈幕信息傳入播放器,播放器分配軌道,軌道播放彈幕。
在我自己的實現(xiàn)中增加了幾個部件,這個結(jié)構(gòu)變成了:播放器->軌道組->分發(fā)器->軌道控制器->軌道->彈幕。
新增了軌道組、分發(fā)器、軌道控制器三個角色來提供更多樣豐富的功能。
技術(shù)選擇
根據(jù)我的調(diào)研結(jié)果,iOS端目前實現(xiàn)彈幕的動畫手段有UIViewAnimation和CADisplayLink兩種,根據(jù)我個人的主觀意志對比一下優(yōu)劣:
A.UIViewAnimation:
優(yōu)點:
1.調(diào)用簡單,直接規(guī)定初末狀態(tài)就可以實現(xiàn)。
2.據(jù)說CoreAnimation執(zhí)行的效率比直接使用CADisplayLink要好(我自己沒有證實過)。
缺點:
1.無法規(guī)定彈幕軌跡,對彈幕運動的細節(jié)缺少控制,因此這種實現(xiàn)方式能實現(xiàn)的彈幕形態(tài)比較單一。
2.貌似只有UIView會有animatedWith接口,不能使用CALayer,這可能會導致它的性能瓶頸比CADisplayLink略低一些(這個與優(yōu)點的2不沖突,優(yōu)點2的對比條件應該是兩種都使用UIView做動畫)。
3.如果你希望視頻暫停是彈幕停在屏幕中不動,UIViewAnimation可能做不到。
B.CADisplayLink
優(yōu)點:
1.可以定義彈幕動畫的任意一處細節(jié),同樣是從A點移動到B點,CADisplayLink可以定義曲線,而UIViewAnimation只能定義直線(也可能有方法我不知道)。
2.CADisplayLink不依賴UI組件,所以彈幕的變化可以不局限于UI變化,甚至可以在變化中不斷更換Model或者文案。
缺點:
1.實現(xiàn)起來確實沒有UIAnimationView容易。
總之,UIViewAnimation是一套快捷簡便的方案,但支持的彈幕種類、彈幕控制方面有一定局限;CADisplayLink則必定伴隨一套大而全的彈幕機制,其提供的回報也是豐富的,我們可以精準控制到彈幕播放中的每一處細節(jié)。
結(jié)論:不論使用哪種方式,表現(xiàn)給使用者的便捷性和拓展性都應當是一致的,所擇CAdisplayLink來實現(xiàn)能提供能豐富的功能,至于實現(xiàn)復雜性,F(xiàn)rame就是為了解決這些復雜性存在的。
附上自身實現(xiàn)的一個彈幕組件:
LNDanmakuMaster