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