J2ME下的手機遊戲的優化

weixin_33763244發表於2017-11-01


手機遊戲的優化

手機遊戲設計中由於裝置效能限制,可能出現資源不足的情況,這就需要優化實現技術,遊戲的優化有很多的技巧,在我做的這個遊戲中使用了以下方法:
   關於異常的處理
Java中提供了try/catch來方便使用者捕捉異常,進行異常處理。但是如果使用不當,也會給J2ME程式的效能帶來影響,所以在程式的編寫過程中,應注意以下兩點:如果可以使用ifwhile等邏輯語句來處理,就儘量不使用異常處理;對於必須要進行異常的處理時,儘可能的重用已經存在的異常物件。
   圖片優化
J2ME的記憶體殺手無疑圖片莫屬,一張3kbpng圖片可以佔用20kb的記憶體。對於圖片的優化在我做的這個遊戲中使用了幾種方法:將所有圖片儲存為8位色,而不是16位或24位;也可以將同一規格的圖片合併,做成一張長條的圖片,並在匯入時使用時creatImage()函式裁剪。如原來為130*50的圖片,取其左面的一部分
playerSprite=new Sprite(Image.createImage("/res/MyPlaneFrames.png"), 65, 50);
 
   程式碼優化
Java的垃圾回收器並非是實時的,從某種角度來講在J2ME上所有垃圾必須由手工釋放,因為簡單型別外所有物件都必須顯示置空。例如在遊戲程式中對於生命麵包類物件bread的宣告:
waterLayer=new TiledLayer(50,200,Image.createImage("/res/backg.png"),32,32);
該段程式碼是先建立了物件然後再進行賦值操作,也就是說在這期間有兩個物件同時存在,這就很可能會產生溢位,同時這樣做也會妨礙垃圾回收器的工作,較好的程式設計如下:
     waterLayer=null
     waterLayer=newTiledLayer(50,200,Image.createImage("/res/backg.png"),32,32); 
把所有物件的初始化放在建構函式中是理所當然的,大多數人通常的做法是把當前邏輯所要用到的資源全部初始化完畢。但是很大一部分的記憶體溢位都是發生在建構函式中,記憶體使用的高峰期都是在建構函式中,避開這個高峰期就能有效地防止溢位,所以程式彙總對於變數的初始化儘量在第一次呼叫時進行。
Java程式碼訪問成員變數比區域性變數所需的時間更長。其原因和兩種變數的記憶體如何訪問有關。實際上,這意味著在效能關鍵的時候,你應該使用區域性變數而不是成員變數。例如有一個迴圈重複訪問的成員變數,那麼,應該考慮在開始迴圈之前把這個成員變數儲存到一個區域性變數中。下面是遊戲中在一個迴圈中訪問成員變數:
 
for(int i=0;i<MAX_BP;i++){ 
                                if(bigPlane[i].getY()>downLimit-bigPlane[i].getHeight()) 
                                  bigPlane[i].setVisible(false);}; 
       可以看到,bigPlane物件的成員變數在迴圈中被訪問了MAX_BP次。這段程式碼的一種快速優化包是把bigPlane[i].geyY設定給一個區域性變數,然後在迴圈中訪問這個區域性變數,可以在for迴圈之前定義區域性變數String a[],然後在迴圈中用a[]代替bigPlane[i].getY
   減少記憶體的使用
       在很多時候,手機記憶體的限制比裝置的有限處理能力的限制要顯著的多,因此儘可能地減少手機遊戲的記憶體使用顯得及其重要,可以利用一些實際的開發方法來減少一個遊戲MIDlet所需的記憶體。一般情況下,對於減少記憶體的使用所用的方法是使用物件時重用物件。
        物件重用就是重新使用已有的物件,而不是建立一個新的物件。這種方法只有在需要重複使用相同類的物件時才奏效。物件重用避免了不必要的記憶體分配。例如如果建立一個物件然後終止使用它,java垃圾回收器最終會釋放分配給它的記憶體。如果需要另一個相同的型別的物件並且建立了新的,物件所需要的記憶體會自動重新分配,那麼,可以把最初的物件重新初始化而不再建立一個新的,這要也就重用了物件。
 

     本文轉自 gaochaojs 51CTO部落格,原文連結:http://blog.51cto.com/jncumter/187893,如需轉載請自行聯絡原作者



相關文章