This commit is contained in:
33333-33333 2026-08-25 14:03:13 +09:00
commit b653d77d4e
49 changed files with 1636 additions and 4724 deletions

View file

@ -1,117 +1,31 @@
# Mandelbrot Deep Zoom v24.2.26
# Mandelbrot WebGPU v24.2.55
## 目的
v24.2.54で確認された、FAST深部描画の矩形状/穴状の黒欠損と、数値補修を最終表示前に待つことによるレイテンシ増大を修正する。
v24.2.23〜v24.2.24 系で発生した「品質低下・速度低下」を撤回し、**v24.2.18 の一次描画を基準線として復元**した版です。
## 黒穴の原因
COLOR passでは数値UNKNOWNを透明としていたが、PRESENT passが履歴補完を `scale <= 1.035 / offset <= 0.022` に制限していた。そのため通常のズームでも履歴補完が無効になり、透明UNKNOWNがcanvasの黒背景へ落ちた。
この版の合格条件は次の4点です
さらに、その不完全front textureを完成historyとしてcommitする経路があった。局所reference補修が予算内で全UNKNOWNを回収できない場合、タイル境界に沿った黒欠損が完成画像へ固定され得た
1. 一次表示は v24.2.18 より遅くしない。
2. 補足精密化を停止しても v24.2.18 より品質を下げない。
3. 通常描画ループで fieldMeta 全体を GPU→CPU readback しない。
4. 黒い `INTERIOR_LIKELY` の追加判定は一次表示後・アイドル時だけ行う。
## v24.2.55の契約
1. 数値UNKNOWNを含むfrontはstable historyへ昇格しない。
2. 通常のパン/ズーム範囲では、数値UNKNOWNを直前のstable frameから再投影して埋める。
3. FASTの数値補修は一次画像のpublishをブロックせず、同一viewのbackground taskとして継続する。
4. background補修が完了して数値UNKNOWNが0になった時点で初めてhistoryを更新する。
5. tiled FAST開始時にmeta/smoothをzero sentinelへ初期化し、最終color前にreason=0の未書込pixelだけbaseline FASTで再計算する。
## 一次描画
`REASON_OPERATION_LIMIT` は数値故障ではなく、maxIterまで未脱出だったpixelなので従来どおり黒表示する。今回の矩形状欠損対策は主に数値UNKNOWN/未書込pixelを対象とする。
一次描画の以下のWGSLは v24.2.18 と **SHA-256まで一致**しています。
## FASTレイテンシ
production BLAのCPU側64点shadow計算を廃止した。BLA workerはtable構築だけを行い、採用判定は既存の64点GPU probeへ一本化した。
- `DIRECT_F32_WGSL`
- `FAST_PERTURB_WGSL`
- `DEEP_PERTURB_WGSL`
- `COLOR_WGSL`
classic Seahorse Valley相当 (654x690, span 3.4e-13, 2900 iter) のNode/V8 workerモデル:
- 旧 CPU validate 64点: 約446.9 ms
- 新 table build only: 約60.0 ms
- 同期prep削減: 約386.9 ms
`maxIter()` も v24.2.18 と同じです
BLAが不利なviewでは本体FAST計算時間そのものは残る。今回の変更では、数値補修Deep/multi-referenceを一次表示のクリティカルパスから外すことで、黒穴を出さずに操作から画像表示までの待ち時間を短縮する
```text
baseIter + floor(70*sqrt(zoomExp) + 15*zoomExp)
```
1920×1080 / 標準負荷の代表条件では内部描画は約 1672×941 = 1,573,352 px です。
| zoom | 一次 iter | 一次描画の最悪 sample-iterations |
|---:|---:|---:|
| 10^6 | 611 | 0.961 B |
| 10^8 | 667 | 1.049 B |
| 10^12 | 772 | 1.215 B |
| 10^20 | 963 | 1.515 B |
これは v24.2.18 と同じ計算量です。補足精密化用WGSLも起動時にはコンパイルせず、一次描画完了から320ms後に初めて遅延コンパイルします。
## アイドル補足精密化
一次描画後にだけ `FIELD_INTERIOR_LIKELY` を追加判定します。
### GPU-only queue
`fieldMeta` をCPUへ戻しません。GPU上で候補インデックスqueueを作り、CPUへ戻すのは **16 byte のqueue統計だけ**です。
候補は次のように絞ります。
- stage 1: 境界近傍 + 4px間隔 seed
- stage 2: 境界近傍 + 8px間隔 seed
- stage 3: 境界近傍 + 16px間隔 seed
境界判定は各候補につき最大8点だけ参照します。広い真内部を毎回全面再計算する方式にはしていません。1920×1080/標準の代表内部解像度では、純粋な疎seedだけなら stage 1/2/3 はそれぞれ約98,648 / 24,662 / 6,195画素です。10^8 の場合、疎seed部分の合計は約0.220B sample-iterationsで、一次描画最悪値約1.049Bの約21%です。境界画素はこれに追加されますが、batch上限と休止でGPU占有を制限します。
### 数値エンジン
高速モードの一次表示は従来のFast経路ですが、**アイドル精密化は高速モードでも guarded Deep を使用**します。精密化用reference bufferは通常描画の `deepCtx / fastCtx` と分離しているため、精密化後もv24.2.18のpan reference再利用を壊しません。
これにより、一次描画で `INTERIOR_LIKELY` だった点だけを保守的に再評価します。精密化シェーダーは実行直前にも対象がまだ `INTERIOR_LIKELY` か確認するため、既存の `ESCAPED` / `INTERIOR_PROVEN` を上書きしません。
### 反復ターゲット
標準モードでは概ね次の3段階です。
| zoom | 一次 | stage 1 | stage 2 | stage 3 |
|---:|---:|---:|---:|---:|
| 10^6 | 611 | 1222 | 2444 | 3000 |
| 10^8 | 667 | 1334 | 2668 | 3600 |
| 10^12 | 772 | 1544 | 3088 | 4800 |
| 10^20 | 963 | 1926 | 3852 | 7200 |
### 1 GPU batch の上限
標準モードの補足精密化は **1.8 million sample-iterations / batch 以下**に丸めます。
例: `10^8`
- 1334 iter: 1344 pixels / batch → 1,792,896 sample-iterations
- 2668 iter: 640 pixels / batch → 1,707,520
- 3600 iter: 448 pixels / batch → 1,612,800
ユーザー操作が入ると `state.token` が変わり、次batchへ進む前に中断します。また一定時間ごとにGPUを休ませます。
## 品質の単調性
補足精密化前の画像は v24.2.18 と同じです。
精密化は `FIELD_INTERIOR_LIKELY` のみを対象とし、既に確定した画素には触れません。さらに再着色時も一次描画の `baseIter` を色周期正規化に使うため、精密化によって既存の外部色が一斉に変化することを避けています。
## 色操作
v24.2.18 のズーム相対色周期と対数スライダーを維持しています。`色を自動変化` の速度のみ、要求どおり v24.2.18 の **1/10** にしています。
## fallback
JavaScript fallback は v24.2.18 と SHA-256一致です。疑似等高線・縞模様は追加していません。
## 検査
```bash
npm test
npm run build
```
`tests/v24-baseline-idle-refinement-model.mjs` が以下を検査します。
- 一次WGSL 4本の v24.2.18 SHA-256一致
- fallback の v24.2.18 SHA-256一致
- `maxIter()` の基準線維持
- 精密化WGSLの遅延コンパイル
- 全meta readback不使用
- 16 byte queue統計readback
- 既存確定画素を上書きしない契約
- 各倍率で1batchが予算を超えないこと
実GPUのfpsやdevice-lost有無は、このコンテナでWebGPUが初期化できない場合は保証できません。静的・CPUモデル結果と実機測定は区別します。
## 数値コア
v24.2.54から変更したproduction WGSLはFAST_PERTURB_WGSLのみ。通常 `unknownOnly=0` の計算式・perturbation recurrenceは変更していない。追加分はcoverage repair用のearly guardである。