雙緩衝可有效解決畫面閃爍並提升繪圖效率。本文說明 MIDP 中雙緩衝的判斷方法、自行實作步驟,以及特定機型 (如 SoftBank 3GC) 可能出現的效能問題與對策。
呼叫 Canvas.isDoubleBuffered(),回傳 true 表示裝置已實作。但為求穩健,業界共識是無論裝置是否支援,皆自行實作一套,多做無害。
// 成員變數
private Image bufferImage = null;
private Graphics bufferGraphics = null;
private int scrW, scrH; // 螢幕寬高
// 初始化 (於螢幕尺寸確定後呼叫)
bufferImage = Image.createImage(scrW, scrH);
bufferGraphics = bufferImage.getGraphics();
// paint() 方法中
public void paint(Graphics g) {
// 1. 取得離屏緩衝區的 Graphics
Graphics bg = bufferGraphics;
if (bg == null) return; // 防禦性檢查
// 2. 清除背景並繪製遊戲畫面
bg.setColor(0x000000); // 黑色背景
bg.fillRect(0, 0, scrW, scrH);
bg.setColor(0xFFFFFF); // 白色前景
bg.drawString("Test double buffer", 10, 50, 0);
// ... 其他繪圖指令 ...
// 3. 一次性將離屏圖像繪製到螢幕
g.drawImage(bufferImage, 0, 0, Graphics.LEFT | Graphics.TOP);
}
sizeChanged、全螢幕切換) 時必須重新 createImage。bufferGraphics 可重複使用。isDoubleBuffered() 通常為 true)。Image 佔用堆疊記憶體,低端機型需注意 OutOfMemoryError。標準流程:isDoubleBuffered() 檢查 → 仍建議自行實作 → 於 paint() 統一離屏繪圖 → drawImage 一次上螢幕。若遇相容性問題,優先嘗試停用自行實作。