# Double Buffer Architecture Research v4
## Focus: DC 生命週期與 GDI 資源管理

---

## 所有靜態 DC 生命週期

### s_hdcPaintBuf (gtwvt.c PaintText)
- **建立時機**：首次 WM_PAINT 或 resize 後
- **銷毀時機**：resize 時（大小變化）
- **永不銷毀**：程式結束時不清理（GDI leak，但 Windows 會回收）
- **大小**：整個 client area (1520×500 ≈ 3MB @32bpp)
- **v4 角色**：主 buffer（ASCII + UDA），最後 BitBlt 到螢幕

### s_hdcDblBuf (usrfont_scan.c ScanAndDrawUda)
- **建立時機**：首次有 UDA 的 WM_PAINT 或 resize 後
- **銷毀時機**：resize 時
- **v4 角色**：不再使用（但仍被建立 — 浪費）
- **大小**：整個 client area (3MB)
- **優化**：v4 模式下跳過建立 → 節省 3MB

### s_hdcMemScan (usrfont_scan.c)
- **建立時機**：首次或 cell size 變化
- **大小**：24×24 DIBSection (2.3KB)
- **用途**：個別 glyph bitmap 操作
- **v4 影響**：無，仍需要

### s_hdcAlpha (usrfont_cache.c)
- **建立時機**：首次 alpha blend
- **大小**：2×cellW × cellH (約 1.5KB)
- **用途**：alpha blending 中間結果
- **v4 影響**：無

### s_hdcDynBuf (usrfont_render.c)
- **建立時機**：首次動態 Unicode 渲染
- **大小**：96×96 (36KB)
- **用途**：supersampling
- **v4 影響**：無

## 記憶體使用對比

| 項目 | 原始 | v3 | v4 | 理想 |
|------|------|----|----|------|
| s_hdcPaintBuf | 3MB | 3MB | 3MB | 3MB |
| s_hdcDblBuf | 3MB | 3MB | 3MB（浪費）| 0 |
| s_hdcMemScan | 2KB | 2KB | 2KB | 2KB |
| s_hdcAlpha | 2KB | 2KB | 2KB | 2KB |
| s_hdcDynBuf | 36KB | 36KB | 36KB | 36KB |
| **總計** | **6MB** | **6MB** | **6MB** | **3MB** |

## v4.1 優化：跳過 s_hdcDblBuf 建立

```c
// usrfont_scan.c: 在 s_hdcDblBuf 建立前加
extern HDC g_hPaintBuf;
if( g_hPaintBuf )
{
   // v4: don't need s_hdcDblBuf, skip creation entirely
}
else
{
   // Original path: create s_hdcDblBuf as before
   if( !s_hdcDblBuf || rc.right != s_nDblBufW || ... )
   { ... }
}
```

## GDI Handle Leak 風險

### 程式結束時
- 5 個靜態 DC + 5 個靜態 HBITMAP = 10 GDI handles 未釋放
- Windows 在 process exit 時回收，但嚴格來說是 leak
- 如果加入 WM_DESTROY 清理會更乾淨

### Resize 時
- DeleteDC + DeleteObject 正確配對
- 新的 CreateCompatibleDC + CreateCompatibleBitmap 正確建立
- **風險**：如果 Create 失敗（GDI 耗盡），fallback 到 hdc=hdcScreen（直接畫螢幕）
