# v1.6/v1.7 からの変更まとめ (Changes since v1.6/v1.7)

本書は，上流（v1.6 / v1.7）を知っている読者に向けて，**各変更について「状況 → 具体的な差分」を 1 まとまり**で確認できるようにしたサマリである．クラッシュ修正・メモリリーク修正・性能改善を主軸とし，構造リファクタ・追加機能は末尾に概要のみ示す．

## 使い方 (How to Read)

各変更に，**該当ファイルへのリンク**（クリックでエディタに開く）と，その変更を **VS Code の左右差分で開く `git difftool` コマンド**を付けた．リポジトリさえあれば**どのマシン・どの OS でも動く**（GitHub 不要・埋め込みリンクなし）．

**初回だけ VS Code を差分ツールに設定する**（全リポジトリ共通）:

```bash
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff "$LOCAL" "$REMOTE"'
```

- **`git difftool -y <SHA>^ <SHA> -- <path>`**: そのコミットで当該ファイルが**変更前 ↔ 変更後**でどう変わったかを **VS Code の左右差分**で開く．
- 設定せずに見たいときは **Timeline**: 該当ファイルを開き，エクスプローラーの「タイムライン」でコミットをクリックすると同じ左右差分が開く．
- ターミナル内のインライン差分で十分なら `git show <SHA> -- <path>` でも可．

## クラッシュ修正 (Crash Fixes)

### 連続撮影クラッシュ（`_shots` スレッドセーフ化）

- **状況**: 連続撮影で 4 枚以上取得するとたまにクラッシュしていた．撮影スレッドと保存スレッドが `_shots`（`List<Mat>`）を無保護共有し，容量拡張時のリサイズ競合・TOCTOU が原因．
- **変更**: 生産者-消費者を `BlockingCollection` に置換し，撮影/保存間を安全化．
- **効果**: 連続撮影の確率的クラッシュを解消．
- **差分で確認（VS Code 左右差分）**:
  - [CameraBase.cs](../TIASshot/Cameras/CameraBase.cs) — `git difftool -y 5df961c^ 5df961c -- TIASshot/Cameras/CameraBase.cs`

### OOM クラッシュ（`ConvertImage` 中間 Mat 解放）

- **状況**: 連続撮影で `ColorCorrector.ConvertImage` の中間 Mat（`flatten`/`extended`/`converted`/`convertedImage`）が未解放で数十 GB 積み上がり OOM．IScam 17ch × 複数フレームを高速に回すとファイナライザ回収が追いつかない．
- **変更**: 中間 Mat を入れ子 `using` で確定解放．
- **効果**: 連続撮影の OOM を解消．
- **差分で確認（VS Code 左右差分）**:
  - [ColorCorrector.cs](../TIASshot/ColorCorrection/ColorCorrector.cs) — `git difftool -y 0003cc2^ 0003cc2 -- TIASshot/ColorCorrection/ColorCorrector.cs`

### Lucam クロススレッド GDI クラッシュ

- **状況**: Lucam は二重バッファ `_bmps[]` をコールバックスレッドで Dispose する．入力 bmp を直接 `picDisplay.Image` に載せると UI の `OnPaint` と別スレッド同時アクセスでクラッシュしうる（v1.6 からの潜在バグ）．
- **変更**: 入力 bmp は「読むだけ」に統一し，表示は呼び出しスレッド上で UI 所有コピーを生成する設計に変更．修正は**表示側（`Form1.ShowImage`）と入力供給側（`IScam` が自分の `ToBitmap` を破棄）**に入る（`Lucam.cs` 自体は不変）．
- **効果**: GDI 同時アクセスクラッシュを解消．
- **差分で確認（VS Code 左右差分）**:
  - [Form1.cs](../TIASshot/UI/Form1.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.cs`（`ShowImage` の所有権変更）
  - [IScam.cs](../TIASshot/Cameras/IScam.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/Cameras/IScam.cs`（入力 `ToBitmap` の破棄）

## メモリリーク修正 (Memory Leak Fixes)

### プレビュー経路リーク（原因1〜3）

- **状況**: プレビュー表示のまま長時間放置で落ちる．`ShowImage` のフルコピー Bitmap が毎フレームリーク（原因1），表示バッファの取りこぼしフレーム未 Dispose（原因2），`PreviewMonitor.UpdateImage` の上書き前未 Dispose（原因3）．撮影しなくても蓄積する．
- **変更**: 表示バッファの所有権を UI 側に統一し，取りこぼしフレームを確実に Dispose．
- **効果**: 放置クラッシュを解消（メモリ天井が一定に）．
- **差分で確認（VS Code 左右差分）**:
  - [Form1.cs](../TIASshot/UI/Form1.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.cs`
  - [PreviewMonitor.cs](../TIASshot/UI/PreviewMonitor.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/UI/PreviewMonitor.cs`

## 性能改善 (Performance)

### 副モニタ描画飢餓 → タイマー駆動化

- **状況**: 校正完了後にコールバックの毎フレーム `Invalidate()` 洪水で Form1 が常時 WM_PAINT 保留になり，同一 UI スレッドの副モニタが描画飢餓（`sub_paint_fps`≈2〜3）．
- **変更**: コールバックからの毎フレーム `Invalidate()` を全廃し，両プレビューを ≒30fps の UI タイマー駆動に統一．
- **効果**: 副モニタが steady に復帰（~19fps）．
- **差分で確認（VS Code 左右差分）**:
  - [Form1.cs](../TIASshot/UI/Form1.cs) — `git difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.cs`

### フレームコピー高速化（FastClone）

- **状況**: プレビューで毎フレーム生成する `new Bitmap(bmp)`（32bppARGB 変換を伴う GDI+ 経路で ~46ms）が律速で実効 FPS が頭打ち．
- **変更**: 同一フォーマットの生画素を `LockBits`＋`RtlMoveMemory` で行単位コピーする `FastClone` に置換（所有権・スレッド安全性は不変）．FastClone 本体は新規 `Utils/BitmapUtil.cs`．
- **効果**: コピー ~46ms→~2.6ms，実効 FPS が倍増．
- **差分で確認（VS Code 左右差分）**:
  - [Form1.cs](../TIASshot/UI/Form1.cs) — `git difftool -y 609baf6^ 609baf6 -- TIASshot/UI/Form1.cs`
  - [BitmapUtil.cs](../TIASshot/Utils/BitmapUtil.cs) — `git difftool -y 609baf6^ 609baf6 -- TIASshot/Utils/BitmapUtil.cs`

## 定量結果 (Quantitative Results)

3 バージョンを実機で同一プロトコル計測した比較（詳細は [TEST_02](06_TEST/TEST_02_性能評価計測結果.md)）．保存経路のメモリは v1.6→v1.7 で上流が改善済み，プレビュー経路は v1.7→現行で本フォークが改善した．

| 指標 | v1.6 | v1.7 | 現行 |
| --- | --- | --- | --- |
| メモリ `private` 包絡線 | ~200→834 MB 上昇 | ~200→700 MB 上昇 | **~180〜200 MB で平坦** |
| フレームコピー時間 | ~46 ms | ~45 ms | **~2.6 ms** |
| コールバック実効 FPS | ~17 | ~17 | **~30** |
| 副モニタ描画 FPS | ~3（飢餓） | ~3（飢餓） | **~19** |

→ v1.6/v1.7 のプレビュー指標が一致するのは，プレビュー経路が v1.7 まで未修正だったため．

## その他の変更（概要） (Other Changes)

主軸ではないが，あわせて入った変更．差分は `git difftool -y <SHA>^ <SHA>`（パス省略でそのコミットの全変更ファイルを順に開く）や `git show <SHA>` で辿れる．

- **構造リファクタ**: フラット構成を `Cameras/`・`ColorCorrection/`・`ChartDetection/`・`UI/`・`Utils/` に再編し，`IScam`/`Lucam` の重複フローをテンプレートメソッドに集約（挙動不変）．`e278f27`（Phase1）ほか，`8a00494`（テンプレートメソッド化）．
- **追加機能**: 白板撮影モード（`WHITEBOARD` ビルド限定・`2854dba`）とメモリ観測ツール（`MEMMONITOR` ビルド限定・`243ddeb`）．いずれも配布ビルドには含めない（[ENV_06](02_ENV/ENV_06_ビルド構成とビルドフラグ.md)）．

## 詳細索引 (References)

- 全変更の経緯・設計判断・失敗パターン: [PROGRESS.md](PROGRESS.md)
- プレビューメモリリーク修正の詳細: [PLAN_03](03_PLAN/PLAN_03_プレビューメモリリーク修正計画.md)
- 性能評価の計画と結果: [PLAN_04](03_PLAN/PLAN_04_性能評価計測計画.md) / [TEST_02](06_TEST/TEST_02_性能評価計測結果.md)
- コミット一覧: `git log --oneline`／ファイル単位の履歴: `git log -p -- <path>`
