優化核心原則
J2ME 裝置資源極受限 (記憶體 1-2MB、CPU 低頻、無 JIT),優化重點在於 減少物件建立、降低 GC 壓力、避免昂貴操作。
十大技巧詳解
- 鎖定目標 FPS:遊戲/動畫先實測裝置繪圖能力,平衡幀率與流暢度,避免盲目追求高 FPS 導致掉幀。
- 複用 Graphics 物件:
GameCanvas.getGraphics() 每次呼叫都新建物件,**在 init() 取一次存為欄位複用**;所有繪圖操作針對同一底層緩衝區。
- 合併監聽器:讓主 MIDlet 實作
CommandListener、ItemStateListener,減少匿名內部類別與物件分配。
- 善用廠商 SDK:Nokia UI API、Siemens Game API、Motorola 專屬擴展等,提供硬體加速繪圖、音訊、全螢幕模式,效能遠優於標準 MIDP API。
- 剖析瓶頸:WTK Profiler、Nokia Energy Profiler、Sony Ericsson Performance Analyzer 等工具定位熱點;實機上用
System.currentTimeMillis() 手動計時關鍵路徑。
- 謹慎使用 System.gc():非阻塞時呼叫可緩解記憶體壓力,但 Nokia 等廠商不建議頻繁呼叫,低端機種 GC 耗時極長,**慎用、定點呼叫** (如場景切換後)。
- 陣列替代 Vector:
Vector 同步化、擴容開銷大;定長或可預估上限時用 Object[] 或基本型別陣列 (int[], byte[])。
- 圖片資源最佳化:依目標螢幕解析度製作圖片,避免運行時縮放;使用 PNG 8-bit 調色盤、移除 Alpha 通道 (不需透明時);大圖分塊載入。
- 及時釋放參考:不用的物件賦值
null,特別是大型圖片、音訊、字節陣列,協助 GC 更早回收。
- 混淆壓縮:ProGuard 等混淆器縮短類別/方法/欄位名稱,**減小 JAR 體積 30%-50%**,同時提高反編譯難度;注意保留 MIDlet 入口點與序列化類別。
進階補充
- 字串操作:大量拼接用
StringBuffer (MIDP 無 StringBuilder)。
- 避免反射:
Class.forName()、Method.invoke() 極慢,靜態綁定優先。
- 預計算/查表法:三角函數、開根號等改用查表或定點運算。
- 畫面臟矩形更新:僅重繪變化區域,減少
repaint() 範圍。