クラッシュ・メモリリーク修正と性能改善(v1.7 を内包) #7

Open hasegawa (Rinto Hasegawa) wants to merge 81 commits into nakaguchi:main from nakaguchi:feature/adopt-fork-crash-memory-perf
Rinto Hasegawa hasegawa (Rinto Hasegawa) commented 1 day ago

概要

上流 v1.6 から派生したフォークの改善をまとめて提出します.主軸は クラッシュ修正・メモリリーク修正・性能改善です.上流 v1.7(メモリ 使用効率化)も取り込み済みで,本ブランチは v1.7 に対してクリーンに マージできます(v1.7 を先に取り込んでいるため衝突・遅れなし).

各変更の「状況 → 具体差分」は docs/変更まとめ_v1.6-v1.7から.md に まとめてあります.

クラッシュ修正

  • 連続撮影クラッシュ: 撮影/保存スレッドが _shotsList<Mat>)を 無保護共有しリサイズ競合・TOCTOU で落ちていた → BlockingCollection による生産者-消費者に置換
  • OOM: ColorCorrector.ConvertImage の中間 Mat 未解放で数十 GB 積み上がり OOM → 入れ子 using で確定解放
  • Lucam クロススレッド GDI クラッシュ: 入力 bmp を UI に直載せして 別スレッド同時アクセスで落ちうる問題 → 表示は UI 所有コピーに統一

メモリリーク修正

  • プレビュー経路リーク: 表示バッファのフルコピー Bitmap 毎フレーム リーク・取りこぼしフレーム未 Dispose・上書き前未 Dispose(原因1〜3) → 所有権を UI 側に統一し確実に解放(放置でもメモリ天井が一定に)
  • 校正経路の Mat リーク: CalcTccColorCorrector / CameraBase)で 中間 Mat・旧変換行列・tccRgb/imgRois が未解放だった分を解放. v1.7 が校正経路で行ったメモリ修正に相当する箇所を本フォークでも 解消し,v1.7 の狙いを内包

性能改善

  • 副モニタ描画飢餓: コールバックの毎フレーム Invalidate() 洪水を 全廃し,両プレビューを ~30fps の UI タイマー駆動に統一
  • フレームコピー高速化: GDI+ 経由の new Bitmap(bmp)(~46ms)を LockBits+RtlMoveMemoryFastClone(~2.6ms)に置換

定量結果(実機・同一プロトコル計測)

指標v1.6v1.7本 PR
メモリ 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

その他(挙動不変)

  • 構造リファクタ: フラット構成を Cameras/ ColorCorrection/ ChartDetection/ UI/ Utils/ に再編,IScam/Lucam の重複フローを テンプレートメソッドに集約.この再編のため diff は大きく見えますが 挙動は不変です
  • 追加機能(配布ビルド非搭載): 白板撮影(WHITEBOARD)・メモリ観測 (MEMMONITOR)をビルドフラグで分離
  • テスト: ピュアロジック層(色補正・設定・画像統計等)に NUnit 自動テストを追加

検証

  • x64 ビルド成功/NUnit 自動テスト全緑
  • 実機での撮影・保存・プレビュー・校正は手動確認
Labels

Priority
default
Milestone
No milestone
Assignee
No one assigned
1 participant
Rinto Hasegawa