由于分區(qū)計(jì)算,所以相鄰區(qū)之間的沖突問題解決是很關(guān)鍵的朽合,不論是靜態(tài)分區(qū)俱两,還是動(dòng)態(tài)分區(qū)。邊界沖突的核心是由于分區(qū)引起的曹步。當(dāng)一個(gè)邏輯上獨(dú)立的實(shí)體跨在分區(qū)的邊界上宪彩,那么,從分區(qū)的理論上讲婚,就會(huì)導(dǎo)致該實(shí)體被硬性的分割為2個(gè)實(shí)體尿孔。其中一個(gè)分區(qū)為計(jì)算該實(shí)體的行為時(shí),比如走動(dòng)筹麸,那么他就必須同時(shí)獲取另外一個(gè)分區(qū)中活合,該實(shí)體的狀態(tài);而另外一個(gè)分區(qū)遇到的也是同樣的問題物赶,這就是產(chǎn)生了邊界沖突芜辕。表現(xiàn)的連續(xù)性要求和實(shí)現(xiàn)的分區(qū)技術(shù)是邊界沖突的關(guān)鍵因素。
現(xiàn)在块差,我們先建立個(gè)簡(jiǎn)單的模型來討論這個(gè)問題侵续。假設(shè)存在A、B兩個(gè)分區(qū)憨闰,有個(gè)角色R沿著邊界線行走状蜗。這個(gè)模型很簡(jiǎn)單,但同樣能反應(yīng)大多數(shù)問題鹉动。假設(shè)A負(fù)責(zé)計(jì)算R的狀態(tài)轧坎,當(dāng)R從x1y1移動(dòng)到x2y2,那么A就必須獲取R在B中的狀態(tài)泽示,比如他的走路位置缸血,速度等,同時(shí)械筛,還需要知道B區(qū)中的地面情況捎泻。因?yàn)镽并不知道他正在走的路是被分割成2個(gè)區(qū),所以他有可能在他走的路上左右搖擺成S形埋哟,那么A和B所擁有的R的數(shù)據(jù)將劇烈抖動(dòng)笆豁,一會(huì)兒A區(qū)剩下右腳趾,一會(huì)兒B區(qū)剩下左手掌,這種情況很可怕闯狱。為了避免這個(gè)劇烈抖動(dòng)所造成的影響煞赢,我們必須將R作為一個(gè)整體保存在A區(qū),那么因?yàn)镽劇烈搖擺造成的抖動(dòng)將被大大降低了哄孤。為了降低分區(qū)造成的抖動(dòng)照筑,我們?cè)诜謪^(qū)時(shí),加入邏輯為單位的限制瘦陈,也就是說邏輯上完全獨(dú)立的實(shí)體凝危,不能被分割。于是双饥,我們只要在A區(qū)中計(jì)算R的狀態(tài),然后刷新到B區(qū)中弟断,因?yàn)檫吔缭斐傻臎_突就不復(fù)存在了咏花,AB既能保持一致,也能保證分區(qū)的存在阀趴。
事情并沒有完昏翰,如果R1、R2正好在邊界上戰(zhàn)斗刘急,那么事情就嚴(yán)重了棚菊。R1在A區(qū),而R2在B區(qū)叔汁,顯然统求,這種原則同樣滿足前面的原則,但關(guān)聯(lián)的實(shí)體R1据块、R2依然造成很大的麻煩码邻。當(dāng)R1攻擊R2時(shí),R1的狀態(tài)依賴于R2另假,而R2的狀態(tài)同樣依賴于R1,R1和R2之間的碰撞檢測(cè)同時(shí)依賴于雙方的狀態(tài)。顯然R1扣甲、R2分置于不同的區(qū)給這種關(guān)聯(lián)計(jì)算帶來了復(fù)雜度笤休。但是,將R2移到R1中戈轿,卻也同樣不行凌受,為什么呢?假設(shè)R1是個(gè)法師思杯,他有45碼的攻擊距離胁艰,那么,就必須將這45碼距離內(nèi)的所有實(shí)體都移入到A區(qū),再假設(shè)還有個(gè)NPC同樣在45碼的距離外攻擊R2腾么,那么奈梳,就是90碼距離內(nèi)的實(shí)體同時(shí)移到A區(qū)中,這顯然打破了分區(qū)的要素解虱。
更可怕的是攘须,如果有個(gè)國(guó)戰(zhàn)在這邊界發(fā)生,那么R1...Rn可能分屬于N個(gè)分區(qū)殴泰。巨人網(wǎng)絡(luò)在《征途》中宣稱支持萬(wàn)人國(guó)戰(zhàn)于宙,我不知道他的實(shí)現(xiàn)技術(shù),不過我猜測(cè)他應(yīng)該具有某個(gè)限制悍汛,比如在某個(gè)區(qū)域內(nèi)發(fā)生捞魁,然后將這個(gè)區(qū)域置于一個(gè)服務(wù)器或者服務(wù)器集群上。但不管怎么說离咐,國(guó)戰(zhàn)在分區(qū)策略中造成邊界沖突將是可怕的谱俭。
然而,我們研究下宵蛀,發(fā)現(xiàn)造成這種嚴(yán)重后果的原因有幾點(diǎn):
1昆著、實(shí)體的獨(dú)立性和實(shí)現(xiàn)的分割。每個(gè)角色是獨(dú)立的术陶,但分區(qū)卻可能將他們分割成多個(gè)計(jì)算單元凑懂。
2、實(shí)體的關(guān)聯(lián)性和實(shí)現(xiàn)的分割梧宫。某種動(dòng)作接谨,比如魔法攻擊,將獨(dú)立的實(shí)體關(guān)聯(lián)起來塘匣,不過實(shí)現(xiàn)的分割導(dǎo)致他們不能同屬于一個(gè)區(qū)疤坝。
3、實(shí)體的關(guān)聯(lián)性復(fù)雜度馆铁。當(dāng)實(shí)體關(guān)聯(lián)度比較小時(shí)跑揉,還能通過計(jì)算能力硬扛,不過當(dāng)關(guān)聯(lián)度增加時(shí)埠巨,比如國(guó)戰(zhàn)历谍,一個(gè)范圍魔法可能覆蓋整個(gè)軍團(tuán),幾千人辣垒,這種復(fù)雜度是計(jì)算能力難以忍受的望侈。
我們發(fā)現(xiàn),實(shí)體的獨(dú)立性是無法避免的勋桶,將一個(gè)實(shí)體分割放置于多個(gè)區(qū)脱衙,帶來的問題將更加復(fù)雜侥猬。但是關(guān)聯(lián)性和關(guān)聯(lián)度卻是可以簡(jiǎn)化的。我們就拿國(guó)戰(zhàn)作為例子捐韩。
假設(shè)2個(gè)軍團(tuán)靜止不動(dòng)退唠,那么關(guān)聯(lián)性就不復(fù)存在。當(dāng)一個(gè)角色R1發(fā)出魔法M荤胁,那么源和目標(biāo)之間關(guān)聯(lián)性就存在瞧预,我們將這個(gè)關(guān)聯(lián)予以切割,當(dāng)M在A區(qū)運(yùn)行時(shí)仅政,B并不做計(jì)算垢油,當(dāng)M進(jìn)入B區(qū)時(shí),M的計(jì)算就轉(zhuǎn)入到B圆丹,A區(qū)放棄他的計(jì)算滩愁,直到擊中Rx。M本身也成了一個(gè)獨(dú)立的實(shí)體辫封,如果M是范圍魔法硝枉,那么關(guān)聯(lián)就成多個(gè)一對(duì)一的關(guān)聯(lián)組成,將復(fù)雜的關(guān)聯(lián)轉(zhuǎn)化為簡(jiǎn)單的關(guān)聯(lián)秸讹,降低了復(fù)雜度檀咙。將每個(gè)簡(jiǎn)單關(guān)聯(lián)予以切割雅倒,又解決了關(guān)聯(lián)和分區(qū)的矛盾璃诀。
現(xiàn)在,我們給出一個(gè)解決方案蔑匣。
1劣欢、將所有的實(shí)體在邏輯上劃為成各個(gè)最小粒度的獨(dú)立實(shí)體,比如一個(gè)角色裁良,或者一把劍凿将。
2、將所有的實(shí)體劃分為靜態(tài)和動(dòng)態(tài)實(shí)體价脾。其實(shí)牧抵,所有實(shí)體都是動(dòng)態(tài)實(shí)體是最好的,但計(jì)算量太大了侨把,而且也沒有必要犀变,比如說地圖。我們將他切割成多個(gè)分區(qū)秋柄,由于是靜態(tài)的获枝,所以變化就不會(huì)太大了。
3骇笔、每個(gè)實(shí)體除了為表現(xiàn)而存在的要素外省店,還必須有個(gè)記錄關(guān)聯(lián)的邏輯成員嚣崭。而關(guān)聯(lián)也將被視為一個(gè)邏輯上獨(dú)立的實(shí)體,比如魔法攻擊中火球懦傍,他是關(guān)聯(lián)攻擊者和攻擊目標(biāo)的實(shí)體雹舀,同時(shí)也是邏輯關(guān)聯(lián)。
4谎脯、當(dāng)關(guān)聯(lián)發(fā)生時(shí)葱跋,關(guān)聯(lián)的源或者關(guān)聯(lián)的目標(biāo)將被切割,而只和關(guān)聯(lián)發(fā)生關(guān)系源梭。
這個(gè)方案會(huì)解決了大部分問題娱俺,但不是全部,其余留給后續(xù)的討論废麻。
以前玩英雄無敵3時(shí)荠卷,有個(gè)很好奇的地方,就是在編輯地圖烛愧,效果很好油宜,沒有明顯的邊界存在。比如在一個(gè)沙漠中怜姿,拖個(gè)草地進(jìn)去慎冤,在草地里在扔個(gè)水塘進(jìn)去。顯示出來的邊界卻很圓滑沧卢。這個(gè)技術(shù)很值得學(xué)習(xí)蚁堤。后來,我將英雄無敵3的資源給解析出來但狭,才發(fā)現(xiàn)更有趣的地方披诗,其實(shí)沙漠、草地立磁、水塘有多個(gè)不同形狀構(gòu)成呈队,很平滑。這個(gè)技術(shù)值得學(xué)習(xí)唱歧。