對于基于格子的mmorpg來說,按照格子來存儲周圍所見的物件,是一個比較好的選擇。
但是,由于主角的移動,常常要對格子里的物件進(jìn)行搬移,這大大影響了處理效率。
今天介紹一種方法來優(yōu)化這個搬移操作。
(1)- 名字
偏移網(wǎng)格,從字面上來講,就是使用偏移量來進(jìn)行處理和計算的網(wǎng)格。實際上,也是這么做的。這個方法保存了角色看得到的格子里的所有物件,并且確保離開視野的物件被及時地清理出去,以及在這個視野切換過程中不動的物件牢牢地呆在原地,而不用對他們進(jìn)行搬移。
(2)- 原理
首先,讓我們先來看看下面這張圖示(簡單起見,只假設(shè)玩家能看到1格的范圍):

一開始,我們的主角在 5 號位置,他能看到 1 2 3 4 5 6 7 8 9 這9個格子的物件。接下來,他移動到了9號位置,他現(xiàn)在看不到1,2,3,4,7格內(nèi)的物件了,而他又看到了 A,B,C,D,E 格內(nèi)的東西。
這個過程中,如果用老方法,我們需要把一個 3 x 3 的格子數(shù)組中的 5,6,8,9 格子內(nèi)的物件搬移到原來 1,2,4,5 的格子內(nèi),同時還要清理那里原來的物件。然后清理 3,6,9,8,7格子,把 A, B, C, D, E 格子中的物件丟到原來 3, 6, 9, 8, 7 的格子內(nèi)。
現(xiàn)在,我們換一種思路,原來1號格子,做為數(shù)組的原點,而現(xiàn)在,我們分離出兩個原點:一個物理原點,也就是格子數(shù)組的起始點;另一個是邏輯原點,也就是當(dāng)前主角的可是范圍的原點。在從 5 到 9 的移動完成之后,5 就變成了主角的邏輯原點了,那么這個邏輯原點記作(1,1),也就是表示,主角可視范圍的原點是在物理數(shù)組的 (1,1)位置上。這時候,我們就不用去進(jìn)行 5,6,8,9 到 1,2,4,5 的搬移了,因為他們在邏輯原點所確定的視覺范圍內(nèi)的位置已經(jīng)隨著邏輯原點從位置1(0,0)到位置5(1,1)的更新而更新了。那么,接下來,就是去安排新看到的 A,B,C,D,E了。這里用的是一個循環(huán)計數(shù),也就是當(dāng)物理格子數(shù)組越界之后,把他們折到數(shù)組界內(nèi),比如字節(jié)范圍內(nèi)的 254+2 之后,會被折返成 254+2-255 = 1。這里,他們被折返到原來 1,2,3,4,7 的位置。
經(jīng)過這樣一個過程之后,我們看到,新的思路下,我們會減少4次搬移的操作,這擴(kuò)展到正常數(shù)量的格子之后,我們可以消減掉很大的一個雙重循環(huán)和搬移操作。
(3)- 總結(jié)
從圖上可以看出,這個算法的精髓就是用兩個網(wǎng)格數(shù)組和一個偏移進(jìn)行工作,從而減少一些實際的操作。也正是因為如此,所以,我才叫這個方法是偏移網(wǎng)格。
但是,由于主角的移動,常常要對格子里的物件進(jìn)行搬移,這大大影響了處理效率。
今天介紹一種方法來優(yōu)化這個搬移操作。
(1)- 名字
偏移網(wǎng)格,從字面上來講,就是使用偏移量來進(jìn)行處理和計算的網(wǎng)格。實際上,也是這么做的。這個方法保存了角色看得到的格子里的所有物件,并且確保離開視野的物件被及時地清理出去,以及在這個視野切換過程中不動的物件牢牢地呆在原地,而不用對他們進(jìn)行搬移。
(2)- 原理
首先,讓我們先來看看下面這張圖示(簡單起見,只假設(shè)玩家能看到1格的范圍):

一開始,我們的主角在 5 號位置,他能看到 1 2 3 4 5 6 7 8 9 這9個格子的物件。接下來,他移動到了9號位置,他現(xiàn)在看不到1,2,3,4,7格內(nèi)的物件了,而他又看到了 A,B,C,D,E 格內(nèi)的東西。
這個過程中,如果用老方法,我們需要把一個 3 x 3 的格子數(shù)組中的 5,6,8,9 格子內(nèi)的物件搬移到原來 1,2,4,5 的格子內(nèi),同時還要清理那里原來的物件。然后清理 3,6,9,8,7格子,把 A, B, C, D, E 格子中的物件丟到原來 3, 6, 9, 8, 7 的格子內(nèi)。
現(xiàn)在,我們換一種思路,原來1號格子,做為數(shù)組的原點,而現(xiàn)在,我們分離出兩個原點:一個物理原點,也就是格子數(shù)組的起始點;另一個是邏輯原點,也就是當(dāng)前主角的可是范圍的原點。在從 5 到 9 的移動完成之后,5 就變成了主角的邏輯原點了,那么這個邏輯原點記作(1,1),也就是表示,主角可視范圍的原點是在物理數(shù)組的 (1,1)位置上。這時候,我們就不用去進(jìn)行 5,6,8,9 到 1,2,4,5 的搬移了,因為他們在邏輯原點所確定的視覺范圍內(nèi)的位置已經(jīng)隨著邏輯原點從位置1(0,0)到位置5(1,1)的更新而更新了。那么,接下來,就是去安排新看到的 A,B,C,D,E了。這里用的是一個循環(huán)計數(shù),也就是當(dāng)物理格子數(shù)組越界之后,把他們折到數(shù)組界內(nèi),比如字節(jié)范圍內(nèi)的 254+2 之后,會被折返成 254+2-255 = 1。這里,他們被折返到原來 1,2,3,4,7 的位置。
經(jīng)過這樣一個過程之后,我們看到,新的思路下,我們會減少4次搬移的操作,這擴(kuò)展到正常數(shù)量的格子之后,我們可以消減掉很大的一個雙重循環(huán)和搬移操作。
(3)- 總結(jié)
從圖上可以看出,這個算法的精髓就是用兩個網(wǎng)格數(shù)組和一個偏移進(jìn)行工作,從而減少一些實際的操作。也正是因為如此,所以,我才叫這個方法是偏移網(wǎng)格。


