之前在開(kāi)發(fā)中就發(fā)現(xiàn)“dirty”是一種不錯(cuò)的解決方案:可以用來(lái)延緩計(jì)算或者避免不必要的計(jì)算。后來(lái)在想,這應(yīng)該也算一種設(shè)計(jì)模式吧,于是搜索“Dirty設(shè)計(jì)模式”,沒(méi)有什么結(jié)果,然后換成英文“Dirty design pattern”,搜到了《game programming patterns》這本電子書。書中介紹了Dirty Flag 模式在游戲客戶端的應(yīng)用場(chǎng)景,如果英文不好,這里也有中文翻譯。本文結(jié)合幾個(gè)具體的例子,介紹什么是Dirty Flag 模式,并分析該模式的適用場(chǎng)景以及使用注意事項(xiàng)。
什么是Dirty Flag:
簡(jiǎn)單來(lái)說(shuō),就是用一個(gè)標(biāo)志位(flag)來(lái)表示一組數(shù)據(jù)的狀態(tài),這些數(shù)據(jù)要么是用來(lái)計(jì)算,或者用來(lái)需要同步。在滿足條件的時(shí)候設(shè)置標(biāo)志位,然后需要的時(shí)候檢查(check)標(biāo)志位。如果設(shè)置了標(biāo)志位,那么表示這組數(shù)據(jù)處于dirty狀態(tài),這個(gè)時(shí)候需要重新計(jì)算或者同步。如果flag沒(méi)有被設(shè)置,那么可以不計(jì)算(或者利用緩存的計(jì)算結(jié)果)。另外,在兩次check之間,即使有多次標(biāo)志位的設(shè)置,也只需要計(jì)算一次。
因此,Dirty Flag模式的本質(zhì)作用在于:延緩計(jì)算或數(shù)據(jù)同步,甚至減少無(wú)謂的計(jì)算或者同步。計(jì)算比較容易理解,對(duì)于同步,后面也會(huì)給出例子。在后面的描述中,除非特殊說(shuō)明,計(jì)算也包含了同步。
Dirty Flag使用實(shí)例:
首先,《game programming pattern》中的例子非常形象生動(dòng),圖文并茂,建議直接閱讀原文,本文不再?gòu)?fù)述。接下來(lái)介紹幾個(gè)其他的例子。
First
游戲開(kāi)發(fā)中,有大量的物體(Entity)需要每幀tick(AI、位移),每次tick的時(shí)候檢查一些條件然后做出反應(yīng)。對(duì)于一些entity,可能tick檢查之后發(fā)現(xiàn)什么都不用做,但每次tick檢查也比較耗時(shí),而且出現(xiàn)這種情況的概率還很高。
利用dirty可以改造一些
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26