J2ME遊戲優化祕密

本文章描述了代碼優化在爲移動設備寫運行起來速度快的遊戲中扮演的角色。我會用例子說明如何、什麼時候和爲什麼要優化你的代碼,來榨乾兼容MIDP的手機的每一滴性能。我們將要討論爲什麼優化是必要的和爲什麼有時候最好不要優化。我將解釋高級優化和低級優化的差別,然後我們會知道如何使用J2ME無線開發包(WTK)自帶的Profile程序來發現到哪裏去優化你的代碼。這篇文章最後揭示了很多讓你的MIDlet運行的技術。
      爲什麼優化?
  計算機遊戲可以分爲兩大類: 實時的和輸入驅動的. 輸入驅動的遊戲顯示遊戲的當前運行狀態,並在繼續之前無限地等待用戶的輸入。
  撲克牌遊戲屬於這一類,同樣,大多數的猜謎遊戲、過關遊戲和文字冒險遊戲都屬於這一類。實時遊戲,有時候被稱爲技能或動作遊戲,不等待用戶,他們不停地運行直到遊戲結束。技能和動作遊戲經常以大量的屏幕上運東爲特徵(想想Galaga遊戲和Robotron遊戲)。刷新率必須至少有10fps(每秒的幀數)並且要有足夠的動作來保持玩家的挑戰性。它們需要玩家快速的反應和好的手眼配合,所以就強迫S&A(技能和動作)遊戲必須對玩家的輸入有很強的響應能力。在快速響應玩家案件的同時提供高幀數的圖形動作,這是實時遊戲的代碼必須運行起來快的原因。在用J2ME開發的時候,挑戰性就更大了。
  Java 2 Micro Edition(J2ME)是java的一個分解版本。 適用於有限功能的小型設備,比如手機和PDA。J2ME設備有:
  *有限的輸入能力(沒有鍵盤!)(譯者注:這裏鍵盤特指個人電腦的鍵盤)
  *小的顯示尺寸
  *有限的內存容量和堆大小
  *慢速的CPU
  在J2ME平臺上寫出快的遊戲-------寫出在比桌面電腦裏的慢得多的CPU上運行的代碼更是挑戰了開發者。
  什麼時候不優化
  如果你不是在寫一個技能或者動作遊戲,那麼可能不需要優化。如果玩家已經爲自己的下一步考慮了幾秒鐘抑或幾分鐘,她可能不會介意如果你的遊戲響應花掉了幾百微秒。這個規則的一個例外是,如果這個遊戲在決定下一步如何運行的時候有大量的工作要處理,比如搜索一百萬個可能的象棋片組合。這種情況下,你可能想要優化你的代碼,從而在幾秒鐘內計算出電腦的下一步,而不是幾分鐘。就算你正在寫這種類型的遊戲,優化也可能是危險的。許多這樣的技術伴隨着一個代價--他們表示着好”的程序設計這個通常概念飛過來的時候,同時使你的代碼更難讀懂。有些是一個權衡,需要開發者大大增加程序的大小來得到性能上一點點的改進。J2ME開發者們對於保持他們的JAR儘可能的小這個挑戰再熟悉不過了。這裏是一些不優化的理由:
  *優化是一個增加bug的好手
  *有些技術會降低你的代碼的移植性
  *你可能要花費大量的努力來得到微小的或者沒有改進
  *優化是困難的
  最後一點需要一些闡述。優化是一個活動目標,在Java平臺上更是這樣,而且在J2ME上就更加突出,因爲其運行環境是那樣的多變。
  你優化後的代碼可能在一個模擬器上運行得更快,但卻在實際設備上更慢,或者相反。爲一部手機優化可能會降低其在另一部上的性能。不過還是有希望。有兩條路徑你可以做優化,高層的和底層的。第一條基本上會在所有的平臺上增加執行性能,甚至會改進你代碼的整個質量。第二條是可能會讓你頭疼的,但是那些底層技術是很容易創造的,而且更加容易消去如果你不想使用它們。最起碼,他們看起來很有趣。
   我們將用系統的timer在實際設備上剖析你的代碼,這可以幫助你測量出那些技術在你所開發的硬件上到底有多有效。
  最後一點:
  *優化是有趣的
   一個反面例子:
  讓我們來看一看這個包含兩個類的簡單的應用程序,首先,是Midlet...
  import javax.microedition.midlet.*;
  import javax.microedition.lcdui.*;
  public class OptimizeMe extends MIDlet implements CommandListener {
  private static final boolean debug = false;
  private Display display;
  private OCanvas oCanvas;
  private Form form;
  private StringItem timeItem = new StringItem( "Time: ", "Unknown" );
  private StringItem resultItem =new StringItem( "Result: ", "No results" );
  private Command cmdStart = new Command( "Start", Command.SCREEN, 1 );
  private Command cmdExit = new Command( "Exit", Command.EXIT, 2 );
  public boolean running = true;
  public OptimizeMe() {
  display = Display.getDisplay(this);
  form = new Form( "Optimize" );
  form.append( timeItem );
  form.append( resultItem );
  form.addCommand( cmdStart );
  form.addCommand( cmdExit );
  form.setCommandListener( this );
  oCanvas = new OCanvas( this );
  }
  public void startApp() throws MIDletStateChangeException {
  running = true;
  display.setCurrent( form );
  }
  public void pauseApp() {
  running = false;
  }
  public void exitCanvas(int status) {
  debug( "exitCanvas - status = " + status );
  switch (status) {
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章