




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、卡馬克卷軸算法研究卡馬克卷軸算法研究摘要與關鍵詞摘要與關鍵詞中文摘要中文摘要對于 J2ME 框架下的手機游戲程序的開發(fā),其地圖滾動的重繪有多種算法,由于手機性能的限制和開發(fā)周期等其他非技術條件,需要根據情況靈活選擇所需的技術。但在及其苛刻條件下,如系統(tǒng) CPU 資源不足,地圖塊尺寸較小等,會造成屏幕閃耀,幀數過低等情況,嚴重影響到游戲體驗。在開發(fā)中如此類問題無法繞過以及避免(指通過修改策劃方案,以及程序使用的技術框架) ,則需要考慮使用地圖緩沖繪制技術,卡馬克卷軸就是一種最經典的地圖緩沖繪制技術??捎行У母纳圃诘貓D繪制中的屏幕閃耀,幀數過低等情況。English AbstractFor J2M
2、E Mobile Phone Games under the framework of the development process, and its rolling redraw the map has a variety of algorithms, because of restrictions on mobile phone performance and development cycle and other non-technical conditions required under the circumstances required the flexibility to c
3、hoose technologies. However, in its harsh conditions, such as system CPU resources are insufficient, and a smaller block size, etc., will cause the screen shine, low frames, etc., seriously affecting the gaming experience. At the development of such a category can not bypass the problem and to avoid
4、 (referring to the adoption of amendments to planning programs, as well as the technology used in the framework of the procedure), you need to consider the use of map rendering buffer, scroll Carmack is one of the most classic map buffer rendering. Can effectively improve the mapping of the screen s
5、hine, frames are too low and so on.關鍵詞關鍵詞卡馬克卷軸:一種經典的地圖緩沖繪制技術??捎行У母纳圃诘貓D繪制中的屏幕閃耀,幀數過低等情況。Title:地圖的貼片,指在地圖繪制時,系統(tǒng)重繪的最小地圖單元。一般為正方形,尺寸有8、16、24、32 Pixels 等。地圖重繪:在游戲中由于角色移動造成的地圖顯示區(qū)域的改變,重新繪制地圖的顯示區(qū)域就稱為地圖重繪。緩沖:在內存中建立一個區(qū)域,該區(qū)域等于或者略大于屏幕大小。在重繪時,首先在緩沖區(qū)上重繪,再一次性把緩沖區(qū)畫到屏幕上。這種預先繪制的方式就是緩沖。目錄目錄摘要與關鍵詞摘要與關鍵詞.2中文摘要.2ENGLISH
6、ABSTRACT.2關鍵詞.2正文正文.4緒論緒論.4主體主體.4一、地圖繪制的常用算法和優(yōu)化.41.1無縫圖片滾動畫法.4的裁剪區(qū)畫法.5的圖素切片畫法.71.4最常見的地圖繪制優(yōu)化只繪制當前屏幕.81.5卡馬克卷軸算法的引入.8二、卡馬克卷軸算法原理.92.1X|Y單軸滾動的卡馬克卷軸.92.2X&Y雙軸滾動的卡馬克卷軸.10三、卡馬克卷軸的代碼實現方法.123.1問題簡化與算法步驟.123.2類CarMapBuffer設計.123.3步驟一的實現.143.4步驟二、三的實現.143.5步驟四的實現.153.6步驟五的實現.17四、卡馬克卷軸的實際應用項目分析.194.1項目測試概
7、述.194.2事件查看器的數據比較.204.3內存監(jiān)視器的數據比較.224.4真機測試比較.23結論結論.23致謝致謝.24參考文獻參考文獻.24附錄附錄.24卡馬克卷軸的相關歷史卡馬克卷軸的相關歷史.24正文正文緒論緒論卡馬克卷軸是一種經典的地圖緩沖繪制技術??捎行У母纳圃诘貓D繪制中的屏幕閃耀,幀數過低等情況??梢允褂迷谛阅苁艿较拗频氖謾C上,以提高地圖顯示質量,防止屏幕閃耀,以及提高游戲時的幀數。研究方法及過程如下:首先分析比較幾種常見的地圖繪制方法,指出其優(yōu)劣,并引入地圖緩沖的重繪問題。然后對卡馬克卷軸的算法原理做具體描述以及分析。之后使用 j2me 技術平臺實現卡馬克卷軸算法的 DEMO
8、,用于技術演示。最后在實際開發(fā)的項目中,檢測和評估卡馬克卷軸的實際優(yōu)化效果,并給出結論。由于篇幅以及時間所限,對于卡馬克卷軸的多種變形寫法,沒有做進一步的分析。主體主體一、地圖繪制的常用算法和優(yōu)化一、地圖繪制的常用算法和優(yōu)化注:沒有討論 MIDP2.0 中的 GAMEAPI 下 TiledLayer 類畫法1.1 無縫圖片滾動畫法無縫圖片滾動畫法說明:最簡單的一種畫地圖方法,無需使用數組,使用一張無縫的背景圖片,在屏幕上繪制兩次,以此來實現最簡單的地圖滾動效果,和圖片的重復使用以節(jié)約資源。示意圖:紅色虛線部分為屏幕,使用一個偏移量在屏幕中錯開位置貼上兩次圖片,通過不斷改變偏移量的大小來實現動畫
9、效果。代碼舉例:/imgBack 圖片對象/posX 圖片在 X 軸方向上的偏移量g.drawImage(imgBack, -posX, 0, 0);g.drawImage(imgBack, imgBack.getHeight()+posX, 0, 0);if(posX=-imgBack.getHeight()posX=0;優(yōu)點與局限:此算法非常簡單,由于是單張圖片反復滾動生成的背景圖片,所以對于美術人員的限制較少利于發(fā)揮,而已外觀效果好。但因為不是地圖 Title 組成的,資源復用率不高,只能用于生成不太復雜的地圖。而且由于沒有 Title 的存在,無法針對不同的 Title 計算碰撞。最終
10、使得這種畫法只能用于繪制簡單屏幕背景圖片,而無法用在有復雜物理碰撞的地圖層。1.2MIDP1.0 的裁剪區(qū)畫法的裁剪區(qū)畫法說明:使用二維數組保存地圖信息,另外有一張圖片素材,根據地圖數組的不同下標,配合setClip(x,y,w,h)裁剪區(qū)方法,將對應的 Title 顯示在正確的位置上。示意圖:紅色虛線部分為屏幕,紅色實線為裁剪區(qū),通過讀取地圖數組,將相應的位置設置為裁剪區(qū),并用將圖片素材相對于裁剪區(qū)偏移一定 x,y 位置的方法,使得要繪制的 Title 正好對應出現在裁剪區(qū)中。背景圖片背景圖片屏幕滾動方向代碼舉例:/cellSize 一個 title 的尺寸大小,寬高同/mapArray 地
11、圖數組 ,保存地圖信息/leftTopX,leftTopY 地圖相對于屏幕位置的偏移量/picColNum,圖片素材的 title 列數forfor(intint i=0;imapArray.length;i+)forfor(intint j=0;jmapArray0length;j+)g.setClip(j*cellSize-leftTopX, i*cellSize -leftTopY, cellSize, cellSize);g.drawImage(imgMap, j* cellSize -(mapArrayij-1)%picColNum* cellSize -leftTopX, i* c
12、ellSize -(mapArrayij-1)/picColNum* cellSize -leftTopY, 0);g.setClip(0,0,GameCanvas.WIDTH,GameCanvas.HEIGHT);優(yōu)點與局限:相對于前一種畫法,圖片資源的利用率提高了很多,可以繪制很復雜的地圖。由于 Title 的存在,可以針對不同的 Title 計算碰撞,可以用于地圖物理層的繪制。但是由于 setClip 裁剪區(qū)本身的局限,實際上每次繪制都多畫了很多不會顯示的內容(如上圖) ,因此會造成系統(tǒng)資源的浪費。屏幕尺寸越大,cellSize 越小,資源浪費就越大。屏幕裁剪區(qū)偏移 x,y1.3MIDP
13、2.0 的圖素切片畫法的圖素切片畫法說明:在 MIDP2.0 的 Image 類中添加了 createImage(Image image, int x, int y, int width, int height, int transform)方法,使用該方法可以非常方便的在內存中創(chuàng)建地圖 Title 的切片緩沖區(qū)(Image 對象數組) 。使用切片緩沖區(qū)中的 Title 我們可以很方便的在屏幕中繪制地圖元素。示意圖:紅色虛線部分為屏幕,紅色實線為當前繪制的 title,通過讀取地圖數組,將內存緩沖區(qū)中相對應的 Title 繪制到屏幕上。代碼舉例:/省略了創(chuàng)建地圖 Title 的切片緩沖區(qū)cel
14、lImage的方法forfor (intint i = 0; i mapArray.length; i+) forfor (intint j = 0; j 0)g.drawImage(cellImagemapArrayij-1,j * cellSize -leftTopX,i * cellSize -leftTopY,0);屏幕內存中地圖切片緩沖區(qū)(Image 對象數組)畫在對應位置上優(yōu)點與局限:擁有 1.0 畫法的所有優(yōu)點,繪制地圖十分方便。而且createImage(Image image, int x, int y, int width, int height, int transfor
15、m)方法所創(chuàng)建的圖片為透明圖片,在創(chuàng)建復雜的多重背景滾動地圖時更加游刃有余。1.4 最常見的地圖繪制優(yōu)化最常見的地圖繪制優(yōu)化只繪制當前屏幕只繪制當前屏幕上面的繪制方法都是畫整個地圖的,對于游戲中地圖比屏幕大的情況,會造成很大的資源浪費。在實際開發(fā)中,常用的優(yōu)化方法就是只繪制當前屏幕的地圖 Title。代碼舉例:/計算單元格起始位置下標intint iStart=leftTopY/ cellSize;intint jStart=leftTopX/ cellSize;/計算單元格繪制寬度和高度intint iNum=GameCanvas.HEIGHT/ cellSize +1;intint jNu
16、m=GameCanvas.WIDTH/ cellSize +1;/防止下標越界ifif(iStart+iNum=mapArray.length)iNum=mapArray.length-1-iStart;ifif(jStart+jNum=mapArray0.length)jNum=mapArray0.length-1-jStart;/再使用上面得到的數據修改雙循環(huán)繪制的條件即可,下略1.5 卡馬克卷軸算法的引入卡馬克卷軸算法的引入對于某些資源嚴重不足的手機,或者由于 Title 比較小,循環(huán)次數過多而造成畫圖時屏幕閃耀。就需要針對畫圖時相關算法做進一步的優(yōu)化算法了。不論哪種優(yōu)化算法,一個統(tǒng)一的
17、思路就是盡量減少繪制的次數,從而減少系統(tǒng)資源的消耗??R克卷軸就是這樣算法的一個經典例子。二、卡馬克卷軸算法原理二、卡馬克卷軸算法原理2.1X|Y 單軸滾動的卡馬克卷軸單軸滾動的卡馬克卷軸對于橫版游戲來說,如果角色向右側移動,則地圖向左側滾動。由于角色每次移動若干個pixel(步長) ,因此地圖中新畫出的區(qū)域寬度也為若干個 pixel,那么如果讓系統(tǒng)重繪所有屏幕區(qū)域,很明顯大部分區(qū)域都是和上一次屏幕區(qū)域相同的,如此造成成了資源的浪費。這里有一個思路如果上一次繪制過的地圖也能夠部分重用到本次地圖繪制上來就好了。那么很容易想到在內存中建立一個和屏幕一樣大的(或略大的)Image 緩沖區(qū)即可。地圖的
18、全部區(qū)域上一次屏幕位置當前屏幕位置區(qū)域 B:相同的地圖區(qū)域區(qū)域 C:由于地圖滾動而新出現的區(qū)域區(qū)域 A:由于地圖滾動而被舍棄的區(qū)域地圖滾動方向由上圖可以看到,區(qū)域 B 為相同的地圖區(qū)域,這個區(qū)域在下一次屏幕重繪時,可以被重新利用。區(qū)域 A 是在下一次屏幕重繪中不被采用的區(qū)域,這區(qū)域應當被舍棄,但是如果稍微留意一下的話,不難發(fā)現區(qū)域 A 和區(qū)域 C 的面積大小其實居然是一樣的。那么如果建立一個和屏幕大小相同的緩沖,在其被舍棄掉的繪制區(qū)域 A 中畫上新的區(qū)域 C,再把區(qū)域 B 和區(qū)域 C 拼合到屏幕上,是不是就能達到減少系統(tǒng)資源消耗的目的了呢?卡馬克卷軸的基本原理正是如此。1212緩沖區(qū)屏幕拼合保
19、持不變繪制新內容上圖顯示了卡馬克卷軸的最基本原理,首先在內存中建立一塊和屏幕一樣大?。ɑ蚵源螅┑木彌_區(qū)。然后在本應由于地圖移動而被舍棄掉的區(qū)域 1 上面繪制,由于地圖滾動而出現的新地圖區(qū)域。最后把兩個區(qū)域按照地圖的實際位置拼合到屏幕上。2.2X&Y 雙軸滾動的卡馬克卷軸雙軸滾動的卡馬克卷軸對于俯視游戲,或者有 y 軸卷動的游戲來說,單單一個方向的地圖卷動并不夠用。那么如果是出現兩個方向的卷動會如何呢。不必擔心,上面的思路算法一樣能適應這種情況。上一次屏幕位置當前屏幕位置區(qū)域 D:相同的地圖區(qū)域區(qū)域 C:由于地圖滾動而新出現的區(qū)域區(qū)域 A:由于地圖滾動而被舍棄的區(qū)域區(qū)域 B:由于地圖滾動
20、而被舍棄的區(qū)域區(qū)域 C:由于地圖滾動而被舍棄的區(qū)域區(qū)域 A:由于地圖滾動而新出現的區(qū)域區(qū)域 B:由于地圖滾動而新出現的區(qū)域由上圖可以看到,區(qū)域 D 為相同的地圖區(qū)域,這個區(qū)域在下一次屏幕重繪時,可以被重新利用。區(qū)域 ABC 是在下一次屏幕重繪中不被采用的區(qū)域,可以在這個 3 個區(qū)域上繪制上下一次需要重繪的區(qū)域 ABC。再將繪制好的四個區(qū)域拼合到屏幕的對應位置。12341234緩沖區(qū)屏幕拼合保持不變繪制新內容繪制新內容繪制新內容上圖顯示了 x&y 雙軸滾動的卡馬克卷軸的基本繪制原理,需要特別注意的是:在緩沖區(qū)的繪地圖滾動方向地圖的全部區(qū)域制順序和在屏幕上拼合的順序是完全相反的。三、卡馬克
21、卷軸的代碼實現方法三、卡馬克卷軸的代碼實現方法3.1 問題簡化與算法步驟問題簡化與算法步驟地圖卷軸會分成 8 個方向滾動,初看起來比較復雜。但左上、右上、左下、右下的四個方向又可以看成是 x 以及 y 兩個方向合成的。而不論地圖是在 x 軸卷動還是在 y 軸卷動,無論是正方向還是負方向,其原理是完全相同。如此,算法的研究就變?yōu)槿绾卫L制在 x 軸方向的卷動,其他方向的以此類推即可??R克卷軸緩沖畫法的一般步驟如下:1.初始化所有地圖數據,并且全屏繪制初始的地圖2.若人物移動,則調用攝像機算法,修正地圖偏移量3.地圖偏移量不滿足地圖的邊界條件,就重繪緩沖區(qū)4.重繪緩沖區(qū)5.后臺緩沖區(qū)的四個子區(qū)按照
22、順序畫到屏幕上3.2 類類 CarMapBuffer 設計設計字段定義/* 緩沖區(qū)寬高,命名方式為:Carmack width or height */privateprivate finalfinal intint carWidth, carHeight;/* 緩沖區(qū)寬的圖塊數,與高的圖塊數,命名方式為:Carmack title width or height */privateprivate finalfinal intint carTitleWidth, carTitleHeight;/* 屏幕寬高命名方式為:screen width or height */privateprivat
23、e finalfinal intint scrWidth, scrHeight;/* 緩沖切割線,命名方式為:Carmack x or y */privateprivate intint carx, cary;/* 地圖在緩沖區(qū)的X 、Y偏移量,命名方式為:map offset x or y */privateprivate intint mapOffx, mapOffy;/* 緩沖區(qū),命名方式為:Carmack buffer */privateprivate Image carBuffer;/* 緩沖區(qū)畫筆,命名方式為:Carmack Graphics */privateprivate Gr
24、aphics carGp;/* 緩沖區(qū)增大的大?。ㄉ舷麓笮∈且粯拥模?*/使用這個量讓緩沖區(qū)比屏幕大一些privateprivate finalfinal intint buffSize;/* 圖片寬度的所切割的圖塊數量。 */privateprivate intint imageTitleWidth;/ */ interim 臨時/* 地圖圖片 */privateprivate Image mapImage;/* 地圖數組 */privateprivate bytebyte mapArray;/* 圖塊大小,寬高一致 */privateprivate intint titleSize;/*
25、圖塊的寬度數量,與高度數量 */privateprivate intint titleW, titleH;/* 地圖的寬高 */偏移量的最遠位置,用來修正mapOffx, mapOffyprivateprivate intint mapLastx, mapLasty;方法定義CarMapBuffer(int, int, int, int)構造器CarMapBuffer(int, int, int)構造器的代理setMap(Image, byte)設置地圖參數initBuffer()初始化繪制地圖scroll(int, int)卷動地圖算法updateBuffer(int, int)繪制緩沖區(qū)g
26、etIndexCarX()獲得切割線所在的圖塊索引 XgetIndexCarY()獲得切割線所在的圖塊索引 YgetBufferCarX()獲得切割線在 Buffer 中的 X 位置getBufferCarY()獲得切割線在 Buffer 中的 Y 位置getIndexBuffLastX()獲得緩沖區(qū)后面的 X 索引getIndexBuffLastY()獲得緩沖區(qū)后面的 Y 索引getTitleHeight()獲得當前要繪制的圖塊高度的數量getTitelWidth()獲得當前要繪制的圖塊寬度的數量copyBufferX(int, int, int, int, int) 由于 x 方向卷動造成
27、的重繪copyBufferY(int, int, int, int, int) 由于 y 方向卷動造成的重繪getMapX(int, int) 獲得地圖圖片的 X 坐標偏移getMapY(int, int) 獲得地圖圖片的 Y 坐標偏移paint(Graphics, int, int)將緩沖區(qū)的內容分成 4 塊依次拼合到屏幕上drawBuffer(Graphics, int, int)繪制緩沖區(qū)方法drawRegion(Graphics, Image, int, int, int, int, int, int, int, int)封裝的 drawRegion()方法getGraphics()獲
28、得緩沖區(qū)畫筆getImage()獲得緩沖區(qū) Image 對象3.3 步驟一的實現步驟一的實現初始化所有地圖數據,并且全屏繪制初始的地圖此步驟和普通的地圖繪制基本相同,略過3.4 步驟二、三的實現步驟二、三的實現若人物移動,則調用攝像機算法,修正地圖偏移量,若偏移量在0,maplast移動范圍內移動,則有可能發(fā)生重繪/* * 卷軸滾動 * paramparam x X軸滾動 * paramparam y Y軸滾動 */publicpublic voidvoid scroll(intint x, intint y) x += mapOffx;y += mapOffy;/ */ 邊界檢測ifif (
29、x 0 | y mapLastx) mapOffx = mapLastx;returnreturn;ifif (y mapLasty) mapOffy = mapLasty;returnreturn;updateBuffer(x, y);/若在0,maplast移動范圍內移動,則有可能發(fā)生重繪3.5 步驟四的實現步驟四的實現重繪緩沖區(qū),地圖的 x 方向卷動會造成列方向上的重繪(調用copyBufferX()方法) ,地圖的 y方向上的卷動會造成行方向上的重繪(調用copyBufferY()方法) 。updateBuffer()方法用于針對不同的四個方向上的卷動進行copyBuffer()參數的
30、初始化。/* * 更新緩沖區(qū) * paramparam x 緩沖區(qū)新的地圖X坐標 * paramparam y 緩沖區(qū)新的地圖Y坐標 */privateprivate voidvoid updateBuffer(intint x, intint y) mapOffx = x;/確定了地圖移動,那么記錄新的偏移位置mapOffy = y;/ 右移 x軸正向ifif (x carx + buffSize) /因為緩沖區(qū)比屏幕大了一些,所以還需要判斷當前緩沖區(qū)的內容是否夠用intint indexMapLastX = getIndexBuffLastX();ifif (indexMapLastX t
31、itleW) copyBufferX(indexMapLastX, getIndexCarY(), getTitleHeight(),getBufferCarX(), getBufferCarY();carx += titleSize;/ 左移 x軸負向ifif (x cary + buffSize) intint indexMapLastY = getIndexBuffLastY();ifif (indexMapLastY titleH) copyBufferY(getIndexCarX(), indexMapLastY, getTitelWidth(),getBufferCarX(), g
32、etBufferCarY();cary += titleSize;/ 上移 y軸負向ifif (y cary) cary -= titleSize;copyBufferY(getIndexCarX(), getIndexCarY(), getTitelWidth(),getBufferCarX(), getBufferCarY();重繪緩沖區(qū)的具體方法,該方法涉及到大量的坐標運算,而且由于卡馬克點的存在經常會分成兩個區(qū)域分兩次進行重繪。見下圖:title3124緩沖區(qū)保持不變繪制新內容繪制新內容保持不變地圖滾動方向destxdestyindexMapx indexMapytitleHeight
33、下面以 x方向卷動為例舉例/* * 由于x方向卷動造成的重繪 * paramparam indexMapx 重繪區(qū)域左上角的title的j號 * paramparam indexMapy 重繪區(qū)域左上角的title的i號 * paramparam titleHeight 重繪區(qū)域的高度title數,由這個量來控制兩次重繪的區(qū)域高度 * paramparam destx 重繪區(qū)域在緩沖區(qū)的相對位置x * paramparam desty 重繪區(qū)域在緩沖區(qū)的相對位置y */privateprivate voidvoid copyBufferX(intint indexMapx, intint in
34、dexMapy, intint titleHeight,intint destx, intint desty) intint mapImagex, mapImagey, vy;/ 繪制緩沖區(qū)下面部分 和地圖的上面部分對應forfor (intint j = 0; j titleHeight; j+) mapImagex = getMapX(indexMapy + j, indexMapx);mapImagey = getMapY(indexMapy + j, indexMapx);vy = j * titleSize + desty;carGp.setClip(destx, vy, title
35、Size, titleSize);carGp.drawImage(mapImage, destx - mapImagex, vy - mapImagey, 0);/ 繪制緩沖區(qū)上面部分 和地圖的下面部分對應forfor (intint k = titleHeight; k carTitleHeight; k+) mapImagex = getMapX(indexMapy + k, indexMapx);mapImagey = getMapY(indexMapy + k, indexMapx);vy = (k - titleHeight) * titleSize;carGp.setClip(de
36、stx, vy, titleSize, titleSize);carGp.drawImage(mapImage, destx - mapImagex, vy - mapImagey, 0);3.6 步驟五的實現步驟五的實現將后臺緩沖區(qū)的四個子區(qū)按照順序畫到屏幕上,這一步很簡單,原理之前已經詳細講述過,不再贅述。/* * 繪畫緩沖 * paramparam g 屏幕畫筆 * paramparam x 繪畫X點 * paramparam y 繪畫Y點 */publicpublic voidvoid paint(Graphics g, intint x, intint y) / 地圖在緩沖中的坐標i
37、ntint tempx = mapOffx % carWidth;intint tempy = mapOffy % carHeight;/ 切割線右下角的寬與高intint rightWidth = carWidth - tempx;intint rightHeight = carHeight - tempy;/ 畫左上drawRegion(g, carBuffer, tempx, tempy, rightWidth, rightHeight, 0, x,y, 0);/ 畫右上drawRegion(g, carBuffer, 0, tempy, scrWidth - rightWidth, r
38、ightHeight,0, x + rightWidth, y, 0);/ 畫左下drawRegion(g, carBuffer, tempx, 0, rightWidth, scrHeight - rightHeight,0, x, y + rightHeight, 0);/ 畫右下drawRegion(g, carBuffer, 0, 0, scrWidth - rightWidth, scrHeight- rightHeight, 0, x + rightWidth, y + rightHeight, 0);四、卡馬克卷軸的實際應用項目分析四、卡馬克卷軸的實際應用項目分析4.1 項目測試
39、概述項目測試概述下面以手機游戲FC 惡魔城手機復刻版為例實際檢測一下卡馬克卷軸的繪制優(yōu)化效果。測試環(huán)境如下:硬件環(huán)境: Intel(R) Pentium(R) Dual E2140 1.60GHz 1.60GHz , 2.00G 內存 , NVIDIA GeForce 8500 GT軟件環(huán)境:windowsXpSp2,eclipse3.2+eclipseME1.5 插件,wtk2.2,jdk,使用DefaultColorPhone 模擬器代碼環(huán)境:Title 大小 8pixels,繪制區(qū)域 Title 數量 30*12,普通繪制方法下,每幀繪制 Title 的循環(huán)次數 30*12=360 次;
40、卡馬克卷軸緩沖繪制方法下,每次更新緩沖區(qū)時,繪制 Title 的循環(huán)次數1224 次測試內容以及測試方法為:讓主角移動直到走過第一關的第一個小場景為結束。使用 wtk 的事件查看器和內存監(jiān)控器來進行系統(tǒng)后臺數據的分析。數據分為兩個組,一個組使用卡馬克卷軸優(yōu)化算法,一個組使用普通的地圖繪制算法。比較兩組數據得出結論。4.2 事件查看器的數據比較事件查看器的數據比較首先是卡馬克卷軸繪制地圖組的數據截圖然后是對照組普通繪制地圖時的數據截圖從上面的數據可以看出,使用了卡馬克卷軸算法后,繪制地圖的方法所占用的 CPU 時間的比率大幅度下降,從 55.83%下降到了 9.04%,降幅達到 46.79%,效
41、果十分明顯。兩種情況下的方法調用次數則差不多,分別是 184 次和 182 次。4.3 內存監(jiān)視器的數據比較內存監(jiān)視器的數據比較同樣的,首先是卡馬克卷軸繪制地圖組的數據截圖然后是對照組普通繪制地圖時的數據截圖從上面看出兩者的最大內存消耗基本一致,但是由于卡馬克卷軸涉及到很多坐標運算,所以在當前內存消耗中,有時候會多占用一些內存資源。4.4 真機測試比較真機測試比較采用手機為 nokia6288兩組都能正常運行。普通繪制下,地圖卷動時屏幕暴閃,嚴重影響游戲感受??R克卷軸緩沖繪制下,地圖卷動時屏幕僅有很輕微閃耀(據多方了解,應為 6288 手機的性能所限) 。結論結論卡馬克算法是在進行游戲地圖卷
42、動的算法中內存痕跡最小、效率適中的算法之一其核心的思想就是把地圖卷動過程中移出屏幕(不需要在顯示的部分)所占用的 buffer 區(qū)域,繪制上新的需要圖塊,在往真實屏幕上繪制的時候,通過四次繪制 buffer 把完整的地圖重現我們在實際的代碼編寫中按以下的方式進行根據上面的基本思想,把地圖分為四個塊(十字形的將 buffer 劃分為四塊) ,用 carx 和 cary 來記錄十字分區(qū)的中心坐標(相對于 buffer 的坐標,我把這個點叫卡馬克分區(qū)點) 當地圖向右移動的時候這時把卡馬克分區(qū)點的坐標方向加上一個 tile的 width,然后在從現在的卡馬克分區(qū)點的坐標開始繪制提取出來的 tile對應的圖象,注意是從當前的卡馬克分區(qū)點的坐標開始繪制,當超出 carHeight 時在從開始繪制直到結束,這樣就完成了在水平方向上的更新還有就是在水平移動卡馬克分區(qū)點的時候是在 buffer 中循環(huán)的,也就是從到 carWidth 的一個循環(huán)過程,Y 方向上完全一致最后是繪制過程,也就是將四個分區(qū)繪制出來,口訣就是左變右上變下,掌握好卡馬克算法對手游開發(fā)很有幫助的致謝致謝指導老師:老鄭 網站站
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工建筑勞務合同范本
- 入園合同范例
- 個人陶瓷采購合同范本
- 勞務派遣補充合同范本
- 切磚清工合同范本
- 光明果蔬配送合同范本
- 借款合同范本網上查詢
- 轉租飯店合同范本
- 凈化車間改造工程合同范本
- 會所會籍合同范本
- 2024年注冊安全工程師考試題庫【含答案】
- 第2課《樹立科學的世界觀》第2框《用科學世界觀指導人生發(fā)展》-【中職專用】《哲學與人生》同步課堂課件
- 《書籍裝幀設計》 課件 項目2 書籍裝幀設計要素
- 妊娠期合并癥婦女的護理-妊娠合并心臟病的護理(婦產科護理課件)4EX
- 南航航空安全員培訓
- 中職語文高教版基礎模塊上冊《風景談》公開課一等獎創(chuàng)新教學設計
- 汪小蘭有機化學課件第四版
- Unit1 My day 單元作業(yè)設計(素材)人教PEP版英語五年級下冊
- 贏的思考與態(tài)度課件
- 2024年2月國考海關面試題目及參考答案
- TZSA 158-2023 雙引擎分布式視頻處理器技術規(guī)范
評論
0/150
提交評論