# Double Buffer Architecture Research v10
## Focus: 總結與演進路線圖

---

## 10 輪研究核心發現

| 輪次 | 焦點 | 關鍵發現 |
|------|------|---------|
| v1 | 現況概覽 | 兩個 buffer、4 次螢幕操作、6 個待解問題 |
| v2 | 深入剖析 | 10 個隱藏問題（empty rcPaint、resize stale、UDA remnants...） |
| v3 | Data Flow | PaintText capture 在穩定狀態下是冗餘的（自己抄自己） |
| v4 | DC 生命週期 | s_hdcDblBuf 在 v4 浪費 3MB，可安全跳過建立 |
| v5 | 重入分析 | PaintText/ScanAndDrawUda 不會主動重入，boolean flag 足夠 |
| v6 | Caret 分析 | ScanAndDrawUda 管理 caret 是最安全位置，不建議移動 |
| v7 | Resize 分析 | 全螢幕 dirty 保證 resize 後完整重繪，v4 安全 |
| v8 | ★ v1/v2 失敗根因 | ShowCaret→InvalidateRect→WM_PAINT 無限循環！ |
| v9 | 理想 vs 現實 | 理想架構可行，修正 caret 時序即可 |
| v10 | 總結 | 本報告 |

## 最關鍵的發現：v8 的 ShowCaret 循環

**v1/v2「無法輸入」的根因不是架構問題，而是 ShowCaret 的 InvalidateRect 在 s_bInsidePaint=0 之後觸發 WM_PAINT 循環。**

修正方式：ShowCaret 必須在 s_bInsidePaint=1 期間完成。

## 演進路線圖

```
                     ┌─ v4 (現在) ─────────────────────────┐
                     │ PaintText → s_hdcPaintBuf            │
                     │ skip screen write                     │
                     │ ScanAndDrawUda → g_hPaintBuf 直接     │
                     │ ONE writeback to screen               │
                     │ 2 buffers, 1 screen write             │
                     └───────────────────────────────────────┘
                                    │
                    ┌───────────────┼───────────────┐
                    ↓               ↓               ↓
              v4.1 (安全)     v4.2 (安全)      v5 (中等風險)
              跳過 s_hdcDblBuf  合併 2 globals   PaintText 跳過
              建立(省 3MB)     為 1 個           screen capture
                    │               │               │
                    └───────┬───────┘               │
                            ↓                       │
                      v4.3 (安全)                   │
                      清理+簡化                      │
                            │                       │
                            └───────────────────────┘
                                        │
                                        ↓
                                  v6 (高風險)
                                  理想架構：
                                  一個 shared buffer
                                  PaintText 直接畫
                                  WndProc 做 final BitBlt
                                  修正 ShowCaret 時序
                                        │
                                        ↓
                                  v7 (完成)
                                  去掉 s_hdcPaintBuf
                                  去掉 s_hdcDblBuf
                                  一個 g_hSharedBuf
                                  最簡架構
```

## 安全優化清單（可立即實作）

### v4.1：跳過 s_hdcDblBuf 建立
- 修改 usrfont_scan.c
- g_hPaintBuf 有值時不建 s_hdcDblBuf
- 省 3MB 記憶體
- 風險：無

### v4.2：合併 g_bSharedPaint + g_hPaintBuf
- g_hPaintBuf != NULL 就代表 shared mode
- 去掉 g_bSharedPaint
- 但需要在 PaintText 設 g_hPaintBuf 之前判斷（時序問題）
- **不建議**：時序複雜，收益小

### v4.3：SetStretchBltMode on s_hdcPaintBuf
- 在 PaintText 建立 s_hdcPaintBuf 後加 SetStretchBltMode(COLORONCOLOR)
- 修正 UDA StretchBlt 渲染模式
- 風險：無

## 高風險優化（需要更多驗證）

### v5：PaintText 跳過 screen capture
- 需要 s_bBufferValid 狀態追蹤
- 需要處理 WM_ACTIVATEAPP、WM_DISPLAYCHANGE
- 收益：省一次 dirty-region BitBlt

### v6：理想架構（一個 shared buffer）
- 需要修正 ShowCaret 時序（v8 發現）
- 需要重構 PaintText 的 buffer 管理
- 收益：去掉兩層間接、省 3MB

## 建議

**短期（今天）：** 實作 v4.1 + v4.3（安全、簡單、有收益）
**中期：** 研究 v5（跳過 capture）— 需要仔細測試邊界情境
**長期：** v6 理想架構 — 需要先在 test branch 驗證 ShowCaret 修正
