念
這裡使用簡化的概念,精確的定義請參考計算機圖形學中二維觀察流程。
世界座標系:用於標註整個遊戲世界的座標系。
攝像機:攝像機攝到的區域才能顯示在螢幕上,攝像機在本文中表現為乙個視窗,視窗內的世界才能顯示到螢幕上進而被看到。移動攝像機到不同的位置就可以觀察不同位置的情形。
卡馬克卷軸演算法
如圖所示,當前內容是 1230。當攝像機向右下移動時,其內容應該變為0564,這樣就形成了卷軸的效果。
由原位置變化為新位置的具體做法是:
使用兩個緩衝區:當前緩衝區和新緩衝區。
把新出現的內容繪製到新緩衝區的564部分,然後把當前緩衝區0部分內容繪製繪製到新緩衝區的對應部分,這樣就形成了正確的新位置緩衝區,再把當前緩衝區置為新位置緩衝區,那麼顯示的就是新位置的內容。
這樣做的好處是「不用重新繪製0部分的內容」。因為螢幕移動的幅度不會很大,即123,564的區域很小,所以0部分的區域很大,避免重新繪製0部分能夠帶來效能提公升。
演算法實現優化一:
上面的演算法實現有個問題,就是每次都要開新緩衝區。
解決的辦法是輪換使用當前緩衝區和新緩衝區。當把當前緩衝區指向新緩衝區時,把新緩衝區指向原緩衝區即可。
演算法實現優化二:
演算法優化一還是有個缺點,就是必須使用兩個緩衝區,這個也可以避免。
做法是:
當螢幕在背景中移動時,實際上所涉及的 tile 根本沒有變化,或者只有一小部分發生了改變。所以我們可以建立乙個背景影象緩衝(buffer),儲存當前螢幕的背景影象,減少每幀得畫圖次數,可以大大提高速度。
當我們建立的影象緩衝和黃色區域大小相同時,如果背景涉及的tile沒有變化,我們只需將緩衝影象畫到螢幕的適當位置上。如果背景涉及的 tile 發生了變化,如變為綠色區域,我們只需更新變化的部分tile到背景緩衝,再將緩衝畫到螢幕上即可。
為了保留緩衝影象中已有部分,我們採用滾動更新的方法。假設,當螢幕向右下移動時,緩衝中最上和最左的tile已無用(即i、ii、iii區),我們便將新的最下的tile 儲存在最上(i、ii區),將新的最右的tile儲存在最左(i、iii區),得到新的緩衝影象。最後,我們將新的背景緩衝分4區,按照實際位置畫到螢幕上即可,對應關係如圖。
當然,按照螢幕在背景中的位置,我們的緩衝分割槽會出現四種情況。
l 分1個區,剛好背景沒有被緩衝切開
2 分2個區,背景只在x軸方向被緩衝切開
3 分2個區,背景只在y軸方向被緩衝切開
4 分4個區,背景在x、y軸方向都被緩衝切開
優化二的實質是:1==4,2==6,3==5。即把新出現的564內容繪製到123區域去,顯示的時候再把這些區域顯示到正確的位置上去。這樣就避免了優化一中使用額外的緩衝區的弊端。
物件緩衝
上面的卡馬克演算法針對的是背景緩衝。網上有人實現了物件緩衝。我沒有用到過物件緩衝,想象不到有什麼用怎麼用,所以他的演算法我也沒能一下子看明白。
所以,等我看明白了再續上來吧。
物件緩衝的**:
這篇是很久以前寫的,現在感覺寫的很不仔細,不易理解,
更加詳細的解釋請參考[size=x-large][/size]
卡馬克卷軸演算法
概念 這裡使用簡化的概念,精確的定義請參考計算機圖形學中二維觀察流程。世界座標系 用於標註整個遊戲世界的座標系。卡馬克卷軸演算法 img 如圖所示,當前內容是 1230。當攝像機向右下移動時,其內容應該變為0564,這樣就形成了卷軸的效果。由原位置變化為新位置的具體做法是 使用兩個緩衝區 當前緩衝區...
卡馬克卷軸演算法實現android版
雨松momo 帶你走進遊戲開發的世界之主角的移動與地圖的平滑滾動 卡馬克卷軸演算法研究 地圖雙緩衝 矩形相交判斷 將地圖每次移動時的相交區域作為重複利用資源 緩衝區 如圖a1b1c1d1 移動前 和a2b2c2d2 移動後 相交得到的矩形為aabbccdd。根據判斷矩形是否相交公式為 通過中心點距離...
As3中實現卡馬克卷軸演算法
flash的優化效率挺高的 貌似直接把所有的bitmap放在同乙個sprite裡 直接移動sprite 好像效率也還行 這種方法使用起來相當easy 我曾經嘗試過各種直接操作bitmap的方法 貌似效率都還不如移動整個sprite來得高。flash在介面上 移動的層越少 效率就越高 也就是說 5個b...