J2ME下的手機遊戲的優化
手機遊戲的優化
手機遊戲設計中由於裝置效能限制,可能出現資源不足的情況,這就需要優化實現技術,遊戲的優化有很多的技巧,在我做的這個遊戲中使用了以下方法:
⒈ 關於異常的處理
Java中提供了try/catch來方便使用者捕捉異常,進行異常處理。但是如果使用不當,也會給J2ME程式的效能帶來影響,所以在程式的編寫過程中,應注意以下兩點:如果可以使用if,while等邏輯語句來處理,就儘量不使用異常處理;對於必須要進行異常的處理時,儘可能的重用已經存在的異常物件。
⒉ 圖片優化
J2ME的記憶體殺手無疑圖片莫屬,一張3kb的png圖片可以佔用20多kb的記憶體。對於圖片的優化在我做的這個遊戲中使用了幾種方法:將所有圖片儲存為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);
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);};
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,如需轉載請自行聯絡原作者
相關文章
- SSD 下的 MySQL IO 優化MySql優化
- 【手機遊戲開發優化篇】詳解手遊[體積]及[執行記憶體]的優化篇!薦遊戲開發優化記憶體
- 多核平臺下的JAVA優化Java優化
- Retina屏下的圖片優化優化
- SSD 下的 MySQL IO 優化嘗試MySql優化
- 不同平臺下的網路優化優化
- web下的效能優化1(網路方向)Web優化
- webpack效能優化(下)Web優化
- 圖片無法載入的情況下的優化優化
- 最佳化J2ME程式大小 (轉)
- J2ME環境的搭建
- npm下載速度優化NPM優化
- 【手機遊戲開發優化篇】資深遊戲開發工程師詳解手遊[體積]及[執行記憶體]的優化篇!遊戲開發優化工程師記憶體
- NUMA架構下的預估系統效能優化架構優化
- 【效能優化之道】每秒上萬併發下的Spring Cloud引數優化實戰優化SpringCloud
- hive的優化Hive優化
- web的優化Web優化
- mysql的優化MySql優化
- Cacti的優化優化
- MySQL優化(1)——–常用的優化步驟MySql優化
- 最佳化J2ME應用程式 (轉)
- Random在高併發下的缺陷以及JUC對其的優化random優化
- 容器化RDS|計算儲存分離架構下的 IO 優化架構優化
- WordPress 全方位優化指南(下)優化
- 淺談優化程式效能(下)優化
- React效能優化的8種方式瞭解一下?React優化
- 紋理優化:讓你的紋理也 “瘦” 下來優化
- linux下安裝oracle的個別優化引數LinuxOracle優化
- Flutter的效能優化Flutter優化
- java Synchronized的優化Javasynchronized優化
- Hive --------- hive 的優化Hive優化
- nginx的location優化Nginx優化
- Oracle優化的方法Oracle優化
- mysql的sql優化MySql優化
- ansible的優化優化
- MySQLGroupCommit的優化MySqlMIT優化
- Oracle 索引的優化Oracle索引優化
- oracle 的優化器Oracle優化