兩種J2ME代碼優(yōu)化解決方案
這里向大家簡(jiǎn)單介紹一下J2ME代碼優(yōu)化技術(shù),主要包括高級(jí)優(yōu)化和低級(jí)優(yōu)化兩個(gè)部分,下面分別詳細(xì)討論一下這兩方面的優(yōu)化。
J2ME代碼優(yōu)化
對(duì)J2ME代碼進(jìn)行優(yōu)化的最簡(jiǎn)單辦法就是首先不要調(diào)用這些代碼。這并不是說(shuō)要?jiǎng)h除這些代碼,也許可以用其他辦法來(lái)調(diào)用它們(后者事實(shí)減少對(duì)它的調(diào)用)。游戲的主循環(huán)是游戲運(yùn)行的最主要做的事情,應(yīng)該更多地考慮是否可以不用或減少對(duì)屬于這個(gè)區(qū)域內(nèi)的代碼的調(diào)用。下面的內(nèi)容是參考了其他資料整理出來(lái)的優(yōu)化代碼的方法。
J2ME代碼優(yōu)化的技術(shù)大致分為兩個(gè)主要方面:高級(jí)優(yōu)化,從使用的整體算法和結(jié)構(gòu)出發(fā)進(jìn)行的優(yōu)化;低級(jí)優(yōu)化,集中于孤立的代碼片斷(通常為方法中的代碼)的優(yōu)化。下面分別討論兩方面的優(yōu)化:
一、高級(jí)J2ME代碼優(yōu)化
1,感覺(jué)到就是真實(shí)
對(duì)于電影來(lái)說(shuō),我們通過(guò)攝像頭看到的都是***的,而在拍攝現(xiàn)場(chǎng)我們看到的卻是木頭,泡沫和膠帶。所以對(duì)于電影來(lái)說(shuō),感覺(jué)到就是真實(shí)。
游戲也一樣,只需要處理游戲需要的東西。在游戲開發(fā)的各個(gè)方面這都是實(shí)用的。把精力集中在使游戲有趣和***運(yùn)行的問(wèn)題上,始終只做需要做的而丟棄其他的部分。
2,不要?jiǎng)?chuàng)建對(duì)象
減少對(duì)象創(chuàng)建的總數(shù)量和頻率,結(jié)果能夠大大地提高游戲的性能。還必須小心在不經(jīng)意的情況下產(chǎn)生String對(duì)象。
例如:graphics.drawString(0,0,”Score:”+score);
這一句代碼會(huì)在每次被調(diào)用的時(shí)候產(chǎn)生一個(gè)新的String對(duì)象,在這里就是每一楨畫面顯示時(shí)都會(huì)產(chǎn)生新的String對(duì)象。因此***是只是在分?jǐn)?shù)改變的時(shí)候才構(gòu)造這個(gè)String。
3,繪制屏幕
通常,在對(duì)游戲完成大量的優(yōu)化工作以后,收獲的將是一個(gè)大量時(shí)間耗費(fèi)在屏幕繪圖上的游戲。這是因?yàn)橐粋€(gè)游戲的主要時(shí)耗大都集中在繪制圖像的工作上(或其他的一些基本的繪圖調(diào)用)。因此,如果一開始就可以避免繪制工作,那將是對(duì)游戲的很好的優(yōu)化。
還有就是要減少屏幕繪制,循環(huán)檢測(cè)屏幕圖像是否在某個(gè)部分發(fā)生了改變,如果沒(méi)有,就不要對(duì)那部分的屏幕進(jìn)行更新。另一個(gè)方法就是增加繪制圖像的尺寸來(lái)減少單獨(dú)的繪制調(diào)用的次數(shù)。
4,算法
***的,也是使用最多的高級(jí)優(yōu)化是對(duì)游戲的算法方面。#p#
二、低級(jí)J2ME代碼優(yōu)化
1,提前繪制復(fù)雜圖像
我們已經(jīng)知道,使用LCDUI繪制圖像是很慢的,因此***是能夠避免這種繪制。其中的一個(gè)方法就是用一個(gè)預(yù)生成圖像來(lái)減少?gòu)?fù)雜圖像的繪制。進(jìn)一步來(lái)講,舉例:將所有的游戲狀態(tài)信息整合到一個(gè)面板中(得分,生命數(shù),能量值等),然后對(duì)這些信息進(jìn)行一次性同時(shí)更新。
2,保持類和內(nèi)存之間的平衡
產(chǎn)生新的類會(huì)增加JAR包文件的大小,因此應(yīng)該盡量避免。有的時(shí)候增加了額外類的開銷可能節(jié)省了額外的內(nèi)存開銷,這也是值得的。
3,復(fù)雜值的預(yù)計(jì)算
節(jié)省運(yùn)算的一個(gè)好方法就是對(duì)數(shù)值進(jìn)行預(yù)運(yùn)算,從而無(wú)需再調(diào)用大開銷的計(jì)算方法。一個(gè)很好的例子就是:主窗口畫布的高度和寬度就是很好的緩存對(duì)象。例如:可以調(diào)用getHeight方法和getWidth方法一次,然后將它們的結(jié)果緩存起來(lái),而不是在每一次繪圖中都調(diào)用這兩種方法。
4,使用數(shù)組
在任何時(shí)候,只要可能,都應(yīng)該使用數(shù)組而不是Vector,因?yàn)閿?shù)組的運(yùn)行速度更快。通常面臨的唯一問(wèn)題是,如果最初分配的數(shù)組空間不夠大,將需要對(duì)數(shù)組的大小進(jìn)行擴(kuò)充。這可以做到,但它需要對(duì)整個(gè)數(shù)組進(jìn)行重建。例如:
- Publicfinalstaticint[]expandArray(int[]oldArray,intexpandBy)
- {
- int[]newArray=newint[oldArray.length+expandBy];
- System.arraycopy(oldArray,0,newArray,0,oldArray.length);
- ReturnnewArray;
- }
任何時(shí)候,都應(yīng)該盡量使用一維數(shù)組。訪問(wèn)二維數(shù)組變量的速度只有訪問(wèn)一維數(shù)組變量的一半。當(dāng)然,仍然可以訪問(wèn)二維數(shù)組的對(duì)象,只是需要加入一點(diǎn)點(diǎn)計(jì)算。例如,與其使用這條語(yǔ)句:
world[y][x]=0;
不如下面這條語(yǔ)句運(yùn)行的快:
world[y*tilesWide+x]=0;
這條語(yǔ)句通過(guò)行列的位置將數(shù)值轉(zhuǎn)換成一維值,實(shí)現(xiàn)了對(duì)數(shù)組同一元素的訪問(wèn)。
5,不要使用數(shù)組
呵呵,盡管數(shù)組的訪問(wèn)比Vector快,但仍然比直接訪問(wèn)變量要慢,因此如果可能就應(yīng)該刪除對(duì)數(shù)組的訪問(wèn),或者為一些常用方法中的數(shù)組尋求其他能提高性能的辦法。
6,使用快速方法
并不是所有Java調(diào)用的方法在性能上都是相同的,方法聲明方式的不同對(duì)性能會(huì)會(huì)產(chǎn)生很多的影響。可以使用的最快的方法類型是靜態(tài)方法,因此應(yīng)該盡可能多地將代碼置于靜態(tài)調(diào)用方法中。運(yùn)行速度僅次于靜態(tài)方法的是聲明為final的方法。運(yùn)行最慢的兩種方法是在接口中定義的方法和用關(guān)鍵字synchronized聲明的方法,必須盡可能地避免使用這些類型的方法。
7,其他優(yōu)化
1)異常處理非常緩慢,不要為一半的游戲邏輯使用異常,只用它們來(lái)報(bào)告真正的錯(cuò)誤狀態(tài)。
2)使用switch表達(dá)式比使用if條件語(yǔ)句塊的速度要快。
3)盡可能避免使用String對(duì)象進(jìn)行運(yùn)算,使用StringBuffer。
4)內(nèi)嵌類的運(yùn)行很慢,盡可能避免使用。
5)在完成一個(gè)引用的使用后將它設(shè)為null。
6)不要浪費(fèi)時(shí)間來(lái)將一個(gè)對(duì)象初始化為null或0,java虛擬機(jī)會(huì)替我們完成這樣的初始化
7)多思考新方法,這會(huì)使我們的大腦運(yùn)轉(zhuǎn)的更快。
8)如果可能,盡量使用static,它們運(yùn)行都很快。它同時(shí)適用于方法和域,這條規(guī)則就是,如果它可以是靜態(tài)的,那么就把它聲明為靜態(tài)的。
9)避免類型轉(zhuǎn)換。
【編輯推薦】