功能機時代,許多裝置限制 JAR ≤ 64 KB 甚至 30 KB。圖片資源往往佔 60% 以上體積。與其犧牲功能,不如讓程式「有圖顯圖、無圖顯字」,實現優雅降級。
Image logo = null;
try {
logo = Image.createImage("/logo.png");
} catch (Exception ioe) {
// 忽略:檔案不存在、格式錯誤、記憶體不足等
}
if (logo == null) {
// 降級:繪製文字替代
g.setColor(0x000000);
g.drawString("MyGame", getWidth()/2, getHeight()/2,
Graphics.HCENTER | Graphics.BASELINE);
} else {
g.drawImage(logo, getWidth()/2, getHeight()/2,
Graphics.HCENTER | Graphics.VCENTER);
}
Image icon = null;
try { icon = Image.createImage("/bullet.png"); } catch (Exception e) {}
list.append("設定", icon); // icon 為 null 時僅顯示文字
| 場景 | 高配機 | 低配機(刪圖後重打包) |
|---|---|---|
| 啟動畫面 | 顯示精美 Logo | 自動切換文字標題 |
| 主選單 | 項目前帶圖示 | 純文字列表,功能完全正常 |
| 遊戲角色 | Sprite 動畫 | 簡易幾何圖形繪製 |
關鍵在於程式碼零修改:打包腳本只需排除特定圖片資源,重簽名即可產出「輕量版」JAR。
// build.xml 片段(Ant + ProGuard)
搭配 Image.createImage("/logo.png") 失敗時自動降級,同一份代碼庫可產出標準版/輕量版/極簡版多種交付物。
IOException 可能漏掉 OutOfMemoryError,建議捕獲 Exception 或 Throwable。Image 的地方均需 null 檢查,或封裝 SafeImage 工具類統一處理。「減少圖片」不是偷懶,而是面向裝置差異的防禦性設計。掌握優雅降級,讓同一套代碼從 200 KB 旗艦機跑到 30 KB 入門機,這才是 J2ME 開發者的硬功夫。