處理?xiàng)l件彈幕:LNDanmakuTrackGroup

這個(gè)文章的前置文章是:LNDanmakuMaster

軌道組的由來

假設(shè)產(chǎn)品經(jīng)理提出這樣的需求:所有App鉆石會(huì)員用戶發(fā)的彈幕只能出現(xiàn)在頂部前三排奠宜,黃金會(huì)員用戶第4到6排吼句、白銀用戶第7到9排隅熙;如果我們?nèi)匀徊捎靡粋€(gè)Player/Dispatcher策略涛碑,彈幕的播放條件可能會(huì)互相影響:假設(shè)白銀軌道特別繁忙躯概,一條鉆石軌道的彈幕此時(shí)插入到隊(duì)尾,雖然鉆石軌道當(dāng)前十分空閑,但這條鉆石彈幕不得不等所有隊(duì)列中的白銀彈幕出隊(duì)列之后才能播放,說句實(shí)話這對(duì)氪金大佬十分不友好实苞。

軌道組就是為這種有播放條件彈幕的場(chǎng)景設(shè)計(jì),形成:播放器 -> 多個(gè)軌道組 -> 多個(gè)軌道的結(jié)構(gòu)烈疚,用戶可以挑選任意的軌道放入一個(gè)帶有某種含義的軌道組中黔牵;在插入彈幕時(shí)不是將彈幕插入播放器,而是插入軌道組中胞得;這樣這條彈幕出現(xiàn)的位置就只可能是這個(gè)軌道組所包含的那些軌道荧止。

所以,針對(duì)上面這種場(chǎng)景阶剑,我們只要?jiǎng)?chuàng)建三個(gè)軌道組,diamondTrackGroup危号、goldTrackGroup牧愁、silverTrackGroup, 并將對(duì)應(yīng)的9條軌道分別放入三個(gè)軌道組,在分發(fā)彈幕時(shí)根據(jù)彈幕特性外莲,分別放入不同的軌道組猪半,這樣就實(shí)現(xiàn)了“條件分發(fā)”。這種條件分發(fā)不會(huì)發(fā)生不同種類彈幕之間的相互阻塞偷线,因?yàn)槊總€(gè)軌道組的Dispatcher中存儲(chǔ)的彈幕都是同類彈幕磨确。

軌道組的實(shí)現(xiàn)

軌道組包含了一個(gè)Dispatcher和一組TrackGroup。在這個(gè)TrackGroup小范圍內(nèi)的分發(fā)策略是由這個(gè)Dispatcher決定的声邦,因此乏奥,分發(fā)策略甚至可以與Player整體策略不一致,以下是TrackGroup的屬性定義:

@interface LNDanmakuTrackGroup : NSObject
@property (nonatomic, strong, readonly) LNDanmakuAbstractDispatcher *dispatcher;
@property (nonatomic, copy, readonly) NSArray<LNDanmakuAbstractTrackController *> *currentTrackControllers;
- (void)addTrack:(LNDanmakuAbstractTrackController *)trackController;
- (void)removeTrack:(LNDanmakuAbstractTrackController *)trackController;
- (void)clear;
@end

一個(gè)TrackGroup的工作方式與Player是一致的亥曹,但是它自身不含Clock驅(qū)動(dòng)邓了,依賴Player的驅(qū)動(dòng)工作;在Player每次收到Clock回調(diào)后都會(huì)先更新自己的trackController和dispatcher媳瞪,最后檢查一下軌道組是否也需要同樣的操作:

- (void)danmakuClockUpdateTimeInterval:(NSTimeInterval)time
{
 /**省略**/
 [self trackGroupUpdateTimeInterval:time]; 
}

遍歷軌道組的列表骗炉,先驅(qū)動(dòng)TrackController更新已有彈幕,再檢查Dispatcher是否有機(jī)會(huì)分發(fā)新的彈幕:

- (void)trackGroupUpdateTimeInterval:(NSTimeInterval)time
{
    for (LNDanmakuTrackGroup *trackGroup in self.trackGroupMArr) {
        [trackGroup.dispatcher danmakuClockUpdateTimeInterval:time];
        for (LNDanmakuAbstractTrackController *trackController in trackGroup.currentTrackControllers) {
            [trackController update:time];
        }
        [trackGroup.dispatcher dispatchNewAttributesToFreeTracks: 
        [NSArray arrayWithArray:trackGroup.currentTrackControllers]];
    }
}

(省略了一些判斷的代碼蛇受,展示主要邏輯)

再舉個(gè)例子

Demo示例中這樣展示軌道組:

這個(gè)彈幕播放器中有7種顏色句葵,26條軌道,每種顏色都對(duì)應(yīng)一個(gè)軌道組,每個(gè)軌道組中有4條軌道乍丈,兩個(gè)軌道組間相交2條軌道:

紅 = (0熊响、1、2诗赌、3)

橙 = (2汗茄、3、4铭若、5)

黃 = (4洪碳、5、6叼屠、7 ) 以此類推

分發(fā)時(shí)會(huì)隨機(jī)選取一種顏色生成彈幕瞳腌,根據(jù)這個(gè)彈幕的顏色將他放入不同的軌道組中,就形成了上面的效果镜雨。這個(gè)例子也為了說明不同的軌道組之間也是可以共用軌道的嫂侍,紅和橙兩個(gè)軌道組之間共用了2、3軌道荚坞,因此挑宠,這兩個(gè)軌道上既可能出現(xiàn)紅色彈幕也可能出現(xiàn)橙色彈幕,這樣可以展現(xiàn)出一種融在一起的效果颓影。

軌道組的常見用途

  1. 送大型禮物的彈幕通常在屏幕頂端出現(xiàn)各淀,一般不會(huì)出現(xiàn)在中央。

  2. 左下角飄的聊天室信息也可以放在一個(gè)軌道組里诡挂。

  3. 帶圖片的彈幕通常只能在特殊軌道上播放碎浇,縮放、旋轉(zhuǎn)等璃俗,這種軌道通常要與普通橫向的軌道區(qū)分開奴璃。

  4. 劇情解說類型的彈幕作者通常會(huì)刻意發(fā)在中間一列的那種軌道上(在看一些世界觀比較大的番劇時(shí)通常會(huì)有熱心網(wǎng)友發(fā)彈幕解說或jutou)。

  5. 等等城豁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苟穆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钮蛛,更是在濱河造成了極大的恐慌鞭缭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魏颓,死亡現(xiàn)場(chǎng)離奇詭異岭辣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甸饱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門沦童,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仑濒,“玉大人,你說我怎么就攤上這事偷遗《胀” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵氏豌,是天一觀的道長(zhǎng)喉酌。 經(jīng)常有香客問我,道長(zhǎng)泵喘,這世上最難降的妖魔是什么泪电? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮纪铺,結(jié)果婚禮上相速,老公的妹妹穿的比我還像新娘。我一直安慰自己鲜锚,他們只是感情好突诬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芜繁,像睡著了一般旺隙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浆洗,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天催束,我揣著相機(jī)與錄音,去河邊找鬼伏社。 笑死,一個(gè)胖子當(dāng)著我的面吹牛塔淤,可吹牛的內(nèi)容都是我干的摘昌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼高蜂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼聪黎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起备恤,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤稿饰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后露泊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉镰,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年惭笑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侣姆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片生真。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捺宗,靈堂內(nèi)的尸體忽然破棺而出柱蟀,到底是詐尸還是另有隱情,我是刑警寧澤蚜厉,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布长已,位于F島的核電站,受9級(jí)特大地震影響昼牛,放射性物質(zhì)發(fā)生泄漏术瓮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一匾嘱、第九天 我趴在偏房一處隱蔽的房頂上張望斤斧。 院中可真熱鬧,春花似錦霎烙、人聲如沸撬讽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽游昼。三九已至,卻和暖如春尝蠕,著一層夾襖步出監(jiān)牢的瞬間烘豌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工看彼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廊佩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓靖榕,卻偏偏與公主長(zhǎng)得像标锄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茁计,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容