背景:資源極度受限的生存法則
MTK 等低端平台 CPU/內存/RMS 極其有限。優化不是銷上添花,而是能否在真機跑起來的生死線。以下 20 條為實戰總結,分類整理。
渲染與圖形優化
- 確定目標 FPS:小實驗平衡效果與速度,別盲目追高幀率。
- Graphics 物件復用:
GameCanvas.getGraphics() 每次新建,只取一次 反覆用。
- 圖片規格匹配:高分辨率圖未必顯示得出,建議 128 色/設備原生分辨率,減少解碼壓力。
- 小圖合併切割:多個小 Icon 合併為一張大圖,
Image.createImage(src, x, y, w, h) 運行時切割,減少文件句柄與載入開銷。
- 繪圖調用極簡:
setClip() 限制繪製區域,能預計算座標就預計算,循環外提取不變量。
內存與對象管理
- 監聽器共享:MIDlet 直接實現
CommandListener/ItemStateListener,避免匿名內部類產生大量對象。
- 數組替代 Vector:固定長度用數組,
System.arraycopy() 原生複製比手寫循環快。
- 廢棄對象手動置 null:特別是 String、Vector、Hashtable、Object[],寫
clear() 方法批量清理後再置類引用為 null。
- 慎用 System.gc():無線程阻塞時可緩解壓力,但 Nokia 等廠商不推薦,低端機執行極慢。
- 大數據編碼存儲:字符串編碼/二進制打包,
getResourceAsStream() 讀取,減少堆佔用。
代碼結構與編譯優化
- 混淆器雙重收益:ProGuard 等工具防反編譯 + 縮短類/方法名顯著減小 Class 體積。
- 類/方法數極小化:純 OO 意味著更多虛方法、層次、類。速度排序:靜態方法 > final 方法 > 實例方法 > 介面方法 > 同步方法。
- final static 鎖定熱點方法:小幅提速。
- public 字段替代 getter/setter:極度受限時可用,權衡封裝性。
- 位運算替代乘除模:2 的冪次用移位,循環取模用位與,零比較優於非零比較。
- 循環展開、公共子表達式消除、局部變量缓存數組元素:經典微優化組合拳。
工程化建議
- 只優化熱點代碼(Profiler/真機 Timer 定位)
- 優先改進算法,再用低級技巧
- Nokia S40 / Moto SDK 6.11 模擬器最接近真機
- 優化基於目標設備規格,跨設備效果不同,實機驗證為準
- 私有高性能 API 謹慎用,做好隔離層保護可移植性
參考資源