# Double Buffer Architecture Research v20
## 總結：v4 full 已經是最佳架構

---

## 重新審視 v4 full 的架構

```
Buffer 數量：1 個使用中 (s_hdcPaintBuf)
            s_hdcDblBuf 不建立 (v4.1 跳過)

WM_PAINT 流程：
  PaintText:
    capture: screen → s_hdcPaintBuf (dirty region)
    TextOut → s_hdcPaintBuf (ASCII)
    跳過 screen write (v3)
    export: g_hPaintBuf = s_hdcPaintBuf (v3)
  
  ScanAndDrawUda:
    hdcDraw = g_hPaintBuf (v4, 直接畫)
    UDA → g_hPaintBuf
    writeback: g_hPaintBuf → screen (dirty rows)
    caret management

螢幕操作：2 次 (1 read + 1 write)
Buffer 間複製：0 次
記憶體：~3MB (一個 buffer)
```

## v4 full 已經達成了什麼

| v6 理想目標 | v4 full 實際 | 差距 |
|------------|-------------|------|
| 1 個 buffer | ✅ 1 個 (s_hdcDblBuf 不建立) | 無 |
| PaintText 直接畫到共用 buffer | ✅ 畫到 s_hdcPaintBuf | 名稱不同但功能相同 |
| ScanAndDrawUda 直接畫到共用 buffer | ✅ 畫到 g_hPaintBuf | ✅ |
| 1 次螢幕寫入 | 2 次 (1R + 1W) | capture 是唯一差距 |
| WndProc 管理 buffer | PaintText 管理 | 架構差異，不影響功能 |
| WndProc 做 writeback | ScanAndDrawUda 做 | 架構差異，不影響功能 |

## 唯一的剩餘差距：screen capture

PaintText 每幀做 `BitBlt(buffer ← screen, dirty region)`。
理論上穩定狀態可以跳過（buffer 有上一幀的有效內容）。
但 v5 失敗（畫面切換閃爍）和 v6 失敗（畫面停留）證明跳過 capture 非常困難。

### 為什麼 capture 難以跳過

1. **畫面切換**：RestScreen/Scroll 改變大量 cell → 但可能分多次 WM_PAINT → buffer 有混合內容
2. **dirty region 不完整**：Windows 可能合併 InvalidateRect 為 UNION rect，但 UNION 內可能有未變的區域
3. **buffer vs screen 不一致**：跳過 capture 假設 buffer = screen，但 writeback 只寫 dirty rows，非 dirty 行的 screen 可能被其他操作改變（caret、其他視窗覆蓋）

### capture 的效能成本

- `BitBlt(buffer ← screen, dirty region)` 的效能：
  - 小 dirty（幾個 cell）：< 0.01ms
  - 大 dirty（全螢幕）：~0.1ms
  - **可忽略**

## 結論

**v4 full 已經是實際可達的最佳架構。**

- 1 個 buffer ✅
- 0 次 buffer 間複製 ✅ 
- 1 次 screen write ✅
- 1 次 screen read（capture，效能可忽略）
- 所有功能正常 ✅
- 無閃爍 ✅

**v5（跳過 capture）和 v6（WndProc 管理）的額外收益極小（省 ~0.1ms/幀），但風險高（畫面切換閃爍、畫面停留）。不建議繼續追。**

## 最終架構圖

```
                  WndProc (orchestrator)
                     │
          ┌──────────┤──────────┐
          │          │          │
     g_bSharedPaint  │    g_bSharedPaint
        = 1          │        = 0
          │          │          │
     PaintText    ScanAndDrawUda
          │          │
     ┌────┴────┐     │
     │ capture │     │
     │ TextOut  │    UDA draw
     │ export   │    writeback
     └────┬────┘    caret
          │          │
     s_hdcPaintBuf ←─┘
     (= g_hPaintBuf)
          │
          ▼
       screen
    (1 write only)
```

## v4 full 為 FINAL VERSION
