首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 遊戲引擎主迴圈架構:有無執行緒兩種實作比較

     編輯:J2ME

架構概覽

典型 J2ME 遊戲包含兩個類別:MIDlet(生命週期入口)與 Displayable(繪製與輸入)。主迴圈通常置於 Displayable 實作 Runnable 的 run() 方法中。

方案一:獨立執行緒 + Runnable(通用、推薦)

public class GameCanvas extends FullCanvas implements Runnable {
    private Thread mainThread;
    public static long frameInterval = 20; // ms
    public static boolean running = true;

    public GameCanvas() {
        mainThread = new Thread(this);
        mainThread.start();
    }

    public void run() {
        long last = System.currentTimeMillis();
        while (running) {
            long now = System.currentTimeMillis();
            if (now - last >= frameInterval) {
                last = now;
                gameProcess(); // 邏輯更新 + 繪製
                // FPS 統計...
            }
            lib.sleep(30); // 關鍵:釋放 CPU 讓系統處理事件(來電、切換等)
        }
    }
}

關鍵點:

  • lib.sleep(30)(或 Thread.sleep(30))在 Nokia S60 系列上必須保留,否則遊戲無法切回前景;Moto 手機則不需要但保留無妨。
  • 所有內部迴圈(如載入畫面)也必須加入 sleep。

方案二:無執行緒、主迴圈寫在 MIDlet.startApp()(僅限 Nokia S40)

public class GameMIDlet extends MIDlet {
    public static long frameInterval = 0;
    public static boolean running = false, exitApp = false;
    private GameCanvas canvas;

    public void startApp() {
        running = true;
        Display.getDisplay(this).setCurrent(canvas);
        while (running) {
            long now = System.currentTimeMillis();
            if (now - timeOld >= frameInterval) {
                timeOld = now;
                canvas.gameProcess();
                // FPS 統計...
            }
            // 此處不需 sleep,S40 平台會自動讓出 CPU
        }
        if (exitApp) { destroyApp(true); notifyDestroyed(); }
    }
    // pauseApp/destroyApp 設 running=false...
}

優點:省去一個 Thread 物件,節省微量記憶體。
缺點:僅在 Nokia S40 可靠;S60、Moto 等平台會導致系統無法處理事件(來電、切換),造成死機體驗。

選擇建議

目標平台推薦方案
跨平台(Nokia S40/S60、Moto、SE 等)方案一:獨立執行緒 + sleep(30)
極度記憶體受限、僅針對 S40方案二:無執行緒
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved