長久以來,我對 MFC 與 J2ME 都持保留態度:MFC 宏層層疊疊、控件設計風格不一,讓人難以掌握核心;J2ME 則因缺乏實體裝置測試、且語法與 J2SE 差異大,讓我提不起勁。然而近期專案需求迫使我重新審視這兩項技術,意外發現各有可取之處。
雖然 CLDC、MIDP、CDC 等名詞聽起來陌生,但實際上手後發現,J2ME 程式結構其實就是一個高層遊戲框架:
startApp、pauseApp、destroyApp)。// 典型 MIDP 2.0 遊戲架構
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class GameDemo extends MIDlet {
private GameCanvas game;
protected void startApp() {
if (game == null) game = new GameCanvas();
Display.getDisplay(this).setCurrent(game);
}
// pauseApp, destroyApp 略
}
class GameCanvas extends javax.microedition.lcdui.game.GameCanvas implements Runnable {
private Graphics g;
public GameCanvas() {
super(true); // 關閉系統鍵盤事件
g = getGraphics(); // 只建立一次,重複使用
new Thread(this).start();
}
public void run() {
long last = System.currentTimeMillis();
while (true) {
update();
render();
long dt = System.currentTimeMillis() - last;
if (dt < 40) { // 限制 ~25 FPS
try { Thread.sleep(40 - dt); } catch (Exception ignore) {}
}
last = System.currentTimeMillis();
}
}
private void update() { /* 遊戲邏輯 */ }
private void render() {
g.setColor(0x00FF00);
g.fillRect(20, 20, 10, 10);
flushGraphics();
}
}
關鍵點:
getGraphics() 每次呼叫都會建立新物件,務必在建構子中快取。重拾 MFC 時,群友一句「用心去學」點醒了我。MFC 核心機制雖多(訊息映射、序列化、Document/View 架構),但只要掌握核心宏展開原理與訊息處理流程,其餘控件操作皆可查閱文件即時上手。
BEGIN_MESSAGE_MAP / ON_COMMAND 等巨集,強迫自己理解對應的虛擬函式簽名。CDC、CBitmap、雙緩衝繪圖,過程順暢無阻。目前策略:深入核心(訊息映射、序列化、Document/View),其餘按需查閱。這讓我從「每次都要重學」轉為「隨時可上手」。
J2ME 適合快速原型與輕量遊戲;MFC 則在 Windows 桌面工具開發上仍具不可替代的生態優勢。技術無優劣,唯適合與否。願這些心得能為同樣在兩者間猶豫的開發者提供參考。