: 2026-06-23
対象: PLAN_02 優先度2「ColorCorrector.ConvertImage の中間 Mat 未 Dispose(OOM リーク)」修正
計測者: 自動ベンチ(NUnit、ヘッドレス実行・カメラ実機不要)
修正前(中間 Mat を解放しない=旧実装)と修正後(入れ子 using で解放)で、連続処理時のメモリ使用量の「増え方」がどれだけ変わるかを同一条件で定量比較する。
TIASshot.Tests/ConvertImageMemoryBenchmark.cs([Explicit])。
ColorCorrector.ConvertImage(using 版)。flatten/extended/converted/convertedImage を解放しない)。Process.PrivateMemorySize64 / WorkingSet64 をサンプリング。GC.GetTotalMemory では捕捉できない → PrivateMemorySize64(コミット量)を主指標とする。| 指標 | 修正前(リーク) | 修正後(using) |
|---|---|---|
| Private baseline | 0.05 GB | 0.05 GB |
| Private peak | 2.83 GB | 0.62 GB |
| 増分 (peak−base) | 2.78 GB | 0.57 GB |
| 1 回あたり平均増分 | 71 MB/回 | 15 MB/回 |
| 推移 | 0.82→1.49→2.16→2.83 GB と階段状に上昇 | 全 40 回 0.62 GB で一定 |
→ 修正後の増分は修正前の 約 20%。
| 指標 | 修正前(リーク) | 修正後(using) |
|---|---|---|
| Private peak | 0.53 GB | 0.13 GB |
| 増分 (peak−base) | 0.48 GB | 0.08 GB |
| 1 回あたり平均増分 | 8 MB/回 | 1 MB/回 |
| 推移 | 反復に伴い増加(0.16→0.44→0.53 GB) | 全 60 回 0.13 GB で一定 |
→ 修正後の増分は修正前の 約 17%。
ContinuousShootMemoryBenchmark(BlockingCollection の生産者-消費者・1 フレーム複数チャンネル変換・フレームバッファを合成フレームで構造再現)での計測。単体反復でなく「実機の連続撮影に近いフロー」での結果。
| 指標 | 修正前(リーク) | 修正後(using) |
|---|---|---|
| Private peak | 2.60 GB | 0.92 GB |
| 増分 (peak−base) | 2.55 GB | 0.87 GB |
| 1 フレームあたり増分 | 326 MB/frame | 112 MB/frame |
| WorkingSet peak | 2.47 GB | 0.92 GB |
→ 修正後の増分は修正前の 約 34%。修正前は 1 フレームごとに約 326 MB 積み上がる(フレーム数を増やせば打ち切り上限=OOM へ)。修正後は約 0.9 GB で頭打ち(処理中の一時ピークで蓄積なし)。修正後の per-frame 112 MB は主に「保持中フレーム+処理中の一時メモリ」で,反復しても天井は一定.
SaveThread で高速に回すため、ファイナライザの回収が追いつかず確保が先行 → OOM クラッシュに至る(PLAN_02 の症状)。ConvertImage 単体の隔離計測。条件C は連続撮影フローを構造再現したもので、生産者-消費者スレッディング・多チャンネル・フレームバッファを含むが、カメラ取得部のみ合成フレームに差し替えた再現であり本番メソッド(Shot/RunShotLoop/SaveThread)そのものの呼び出しではない。実フレームレート・実カメラ・ファイル I/O(既定 OFF)までは含まない。実使用そのものの挙動は、MEMMONITOR ビルドのメモリ観測ウィンドウ+実機撮影の録画で別途確認する(PLAN_02「効果検証(メモリ修正)の方法」参照)。# テストプロジェクトを Debug|x64 でビルド後 $vstest = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Extensions\TestPlatform\vstest.console.exe" $dll = "TIASshot.Tests\bin\x64\Debug\TIASshot.Tests.dll" $env:BENCH_WIDTH="2440"; $env:BENCH_HEIGHT="1840"; $env:BENCH_CHANNEL="17"; $env:BENCH_FRAMES="40"; $env:BENCH_CEILING_GB="10" & $vstest $dll /Platform:x64 /Framework:".NETFramework,Version=v4.8" /Tests:Compare_LeakyVsFixed_MemoryUsage /logger:"console;verbosity=normal"
※ スケールは環境変数 BENCH_WIDTH/HEIGHT/CHANNEL/FRAMES/CEILING_GB で調整可。