暫存和分發(fā):LNDanmakuDispatcher

這個文章的前置文章:LNDanmakuMaster

Dispatcher工作方式

Dispatcher的工作方式非常像配貨站携悯,通常有閑置卡車的司機會將自己的卡車信息登記在配貨站赃蛛,需要運送屋子的雇主把貨物道媚、目的地等信息登記在配貨站环形,然后由專人將一些順路的貨物分配到一輛卡車上,這輛卡車裝滿了就發(fā)車磺浙;這種配貨方式可以使運輸資源得到最大限度利用护盈。

Dispatcher的工作方式與配貨站十分類似,一個Dispatcher通常會管理多條軌道闲先,內(nèi)置一個隊列存儲彈幕状土,彈幕在這里就代表了貨物,軌道代表了卡車伺糠;Dispatcher會在時鐘的驅(qū)動下不斷check那些空閑的軌道蒙谓,當某個軌道同時符合空閑度要求和Dispatcher策略時,隊首的彈幕會被添加到這條軌道上训桶。

Dispatcher同時兼顧了自身的分配策略和軌道的空閑度累驮,優(yōu)先級:空閑度 > 分配策略酣倾,例如:在寬松策略下,同時有多個軌道都可以播放隊首的彈幕時谤专,Dispatcher會選擇當前最空閑的那個軌道來放置這條彈幕躁锡,這個空閑度數(shù)值是由TrackController根據(jù)當前自身的狀態(tài)決定,如:條形軌道的最后一條彈幕的剩余存活時間就代表了這條軌道的空閑度置侍。

Queue

LNDanmakuQueue是Dispatcher使用到的存儲結(jié)構(gòu)映之,為了保證按照一定順序添加的彈幕也會按照一定順序播放,同時也提供一定的容錯能力蜡坊,讓那些因為軌道擁塞而不能播放的彈幕也不會被立即丟棄掉杠输。
以下是LNDanmakuQueue對外提供的方法列表,包含了一個Queue結(jié)構(gòu)常規(guī)的push秕衙、pop蠢甲、top、空判斷灾梦、最大容量等方外峡钓,也包括了額外的清空、包含判斷和移除判斷若河,提供一個代理來向外界傳達自己的操作時機能岩。

@interface LNDanmakuDispatchQueue : NSObject
@property (nonatomic, weak) id <LNDanmakuDispatchQueueDelegate> delegate;
@property (nonatomic, assign) NSInteger maxCapacity;
- (void)push:(LNDanmakuAbstractAttributes *)attributes;
- (void)push:(LNDanmakuAbstractAttributes *)attributes priority:(LNDanmakuDispatchQueuePriority)priority;
- (LNDanmakuAbstractAttributes *)top;
- (LNDanmakuAbstractAttributes *)pop;
- (NSArray<LNDanmakuAbstractAttributes *> *)clearQueue;
- (BOOL)contains:(LNDanmakuAbstractAttributes *)attributes;
- (void)remove:(LNDanmakuAbstractAttributes *)attributes;
- (BOOL)isEmpty;
@end

與常規(guī)隊列提供的push方法稍有不同,這個隊列提供了額外的一種按優(yōu)先級的push萧福,使彈幕可以以不同的優(yōu)先級push進這個隊列拉鹃,高優(yōu)的彈幕會先于默認優(yōu)先級彈幕播放。內(nèi)部依靠兩個子隊列實現(xiàn)了這種優(yōu)先級:

@interface LNDanmakuDispatchQueue ()
@property (nonatomic, strong) LNDanmakuDispatchSubQueue *highQueue;
@property (nonatomic, strong) LNDanmakuDispatchSubQueue *defaultQueue;
@end

在pop的時候鲫忍,我們會優(yōu)先檢查高優(yōu)子隊列的空狀態(tài)膏燕,如果高優(yōu)隊列不為空則pop高優(yōu)隊列,否則pop默認優(yōu)先級隊列悟民,這里截取了pop方法:

- (LNDanmakuAbstractAttributes *)pop
{
    if ([self.highQueue top]) {
        return [self.highQueue pop];
    }
    return [self.defaultQueue pop];
}

這種優(yōu)先級隊列的用途:我們考慮展示用戶自己發(fā)送的彈幕在本地展示的情景坝辫,用戶希望自己發(fā)出的彈幕在第一時間得到展示,如果將這條彈幕和普通彈幕一樣插入到隊列中射亏,它可能會在當前隊列中已存在的彈幕都被播完之后才會顯示出來近忙;反之插在隊首,如果有兩條或以上的高優(yōu)彈幕被插入隊首智润,那么對這些高優(yōu)彈幕而言及舍,這個結(jié)構(gòu)就變成了棧。因此窟绷,我們提供了額外的高優(yōu)隊列來解決這個問題锯玛。
每個子隊列內(nèi)部實現(xiàn)在此不過多贅述,本質(zhì)上就是封裝了NSMutableOrderedSet遭商,然后對外暴露方法犁罩。

Dispatcher

LNDanmakuAbstrackDispatcher抽象類中規(guī)定了一個Dispatcher需要支持的所有能力,以下是抽象類的定義:

@interface LNDanmakuAbstractDispatcher (Override)
//private use
- (void)dispatchNewAttributesToFreeTracks:(NSArray<LNDanmakuAbstractTrackController *> *)trackControllerArray;
//public use
- (void)insertNewAttributes:(NSArray <LNDanmakuAbstractAttributes *> *)newAttributesArray;
- (void)insertHighPriorityAttributes:(NSArray <LNDanmakuAbstractAttributes *> *)highPriorityAttributesArray;
- (void)clear;
- (BOOL)containsAttributes:(LNDanmakuAbstractAttributes *)attributes;
- (void)removeAttributes:(LNDanmakuAbstractAttributes *)attributes;
@end
  • -(void)dispatchNewAttributesToFreeTracks 方法被標記了private背苦,意思是肯腕,這個方法只能被LNDanmakuMaster框架內(nèi)部的類調(diào)用献宫,這個方法翻譯成中文:“我這里有一些軌道,如果你有需要播放的彈幕实撒,請從這些軌道中挑選出一個放置你的彈幕”姊途。因此,這個方法只會被Player和TrackGroup調(diào)用知态,Player和TrackGroup是軌道列表的持有者捷兰。
  • 其他的方法和隊列的方法是大體對應(yīng)的,它們都被標記為public负敏,也就是使用者可調(diào)用的方法贡茅,當然這個界限并不是絕對的,因此總是有我們預(yù)料不到的場景需要特殊處理其做。

QA:為什么為dispatcher提供抽象類顶考,雖然大部分場景下的彈幕都是按照順序分發(fā)的,但產(chǎn)品經(jīng)理的意識總會超出常人預(yù)料妖泄,我們假設(shè)他們提出一種從給定的彈幕池子里隨機抽取彈幕進行分發(fā)的需求驹沿,我們重新實現(xiàn)一種新的Dispatcher接入后仍然可以讓這個框架的其他部分正常工作。

梳理一下Dispatcher的工作原理:

  • 使用者通過insertNewAttributes方法將彈幕插入Dispatcher的隊列蹈胡。
  • Player受Clock驅(qū)動渊季,調(diào)用dispatchNewAttributesToFreeTracks方法讓Dispatcher做出選擇并放置彈幕。
  • Dispatcher從給定的TrackController列表中挑選出空閑且符合分發(fā)策略的軌道罚渐,把隊首的彈幕放上去却汉。
  • 彈幕被添加到TrackController后,走TrackController的播放流程荷并。

后續(xù)會單獨有一個文章介紹三種分發(fā)策略:

typedef NS_ENUM(NSInteger, LNDanmakuDispatchStrategy)
{
    LNDanmakuDispatchStrategyDefault = 0, //Find the first track to insert.
    LNDanmakuDispatchStrategyLowDensity, //Find the most free track to insert.
    LNDanmakuDispatchStrategyMostFastDisplay //Find the track with shortest waiting time.
};

typedef NS_ENUM(NSInteger, LNDanmakuRecoverDispatchStrategy)
{
    LNDanmakuRecoverDispatchStrategyDefault = 0,
    LNDanmakuRecoverDispatchStrategyLowDensity,
    LNDanmakuRecoverDispatchStrategyMostFastDisplay,
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末合砂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子源织,更是在濱河造成了極大的恐慌翩伪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雀鹃,死亡現(xiàn)場離奇詭異幻工,居然都是意外死亡励两,警方通過查閱死者的電腦和手機黎茎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來当悔,“玉大人傅瞻,你說我怎么就攤上這事踢代。” “怎么了嗅骄?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵胳挎,是天一觀的道長。 經(jīng)常有香客問我溺森,道長慕爬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任屏积,我火速辦了婚禮医窿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炊林。我一直安慰自己姥卢,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布渣聚。 她就那樣靜靜地躺著独榴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奕枝。 梳的紋絲不亂的頭發(fā)上棺榔,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音倍权,去河邊找鬼掷豺。 笑死,一個胖子當著我的面吹牛薄声,可吹牛的內(nèi)容都是我干的当船。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼默辨,長吁一口氣:“原來是場噩夢啊……” “哼德频!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缩幸,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤壹置,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后表谊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钞护,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年爆办,在試婚紗的時候發(fā)現(xiàn)自己被綠了难咕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖余佃,靈堂內(nèi)的尸體忽然破棺而出暮刃,到底是詐尸還是另有隱情,我是刑警寧澤爆土,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布椭懊,位于F島的核電站,受9級特大地震影響步势,放射性物質(zhì)發(fā)生泄漏氧猬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一坏瘩、第九天 我趴在偏房一處隱蔽的房頂上張望狂窑。 院中可真熱鬧,春花似錦桑腮、人聲如沸泉哈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丛晦。三九已至,卻和暖如春提陶,著一層夾襖步出監(jiān)牢的瞬間烫沙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工隙笆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锌蓄,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓撑柔,卻偏偏與公主長得像瘸爽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铅忿,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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