diff --git "a/docs/\345\244\211\346\233\264\343\201\276\343\201\250\343\202\201_v1.6-v1.7\343\201\213\343\202\211.md" "b/docs/\345\244\211\346\233\264\343\201\276\343\201\250\343\202\201_v1.6-v1.7\343\201\213\343\202\211.md" new file mode 100644 index 0000000..3af1988 --- /dev/null +++ "b/docs/\345\244\211\346\233\264\343\201\276\343\201\250\343\202\201_v1.6-v1.7\343\201\213\343\202\211.md" @@ -0,0 +1,102 @@ +# 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 ^ -- `**: そのコミットで当該ファイルが**変更前 ↔ 変更後**でどう変わったかを **VS Code の左右差分**で開く. +- 設定せずに見たいときは **Timeline**: 該当ファイルを開き,エクスプローラーの「タイムライン」でコミットをクリックすると同じ左右差分が開く. +- ターミナル内のインライン差分で十分なら `git show -- ` でも可. + +## クラッシュ修正 (Crash Fixes) + +### 連続撮影クラッシュ(`_shots` スレッドセーフ化) + +- **状況**: 連続撮影で 4 枚以上取得するとたまにクラッシュしていた.撮影スレッドと保存スレッドが `_shots`(`List`)を無保護共有し,容量拡張時のリサイズ競合・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 ^ `(パス省略でそのコミットの全変更ファイルを順に開く)や `git show ` で辿れる. + +- **構造リファクタ**: フラット構成を `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 -- `