Newer
Older
TIASShot / docs / 変更まとめ_v1.6-v1.7から.md

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 を差分ツールに設定する(全リポジトリ共通):

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 枚以上取得するとたまにクラッシュしていた.撮影スレッドと保存スレッドが _shotsList<Mat>)を無保護共有し,容量拡張時のリサイズ競合・TOCTOU が原因.
  • 変更: 生産者-消費者を BlockingCollection に置換し,撮影/保存間を安全化.
  • 効果: 連続撮影の確率的クラッシュを解消.
  • 差分で確認(VS Code 左右差分):
    • CameraBase.csgit 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.csgit 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.csgit difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.csShowImage の所有権変更)
    • IScam.csgit 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.csgit difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.cs
    • PreviewMonitor.csgit 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.csgit difftool -y 252cde3^ 252cde3 -- TIASshot/UI/Form1.cs

フレームコピー高速化(FastClone)

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

定量結果 (Quantitative Results)

3 バージョンを実機で同一プロトコル計測した比較(詳細は TEST_02).保存経路のメモリは v1.6→v1.7 で上流が改善済み,プレビュー経路は v1.7→現行で本フォークが改善した.

指標v1.6v1.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).

詳細索引 (References)

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