173 lines
8.1 KiB
Markdown
173 lines
8.1 KiB
Markdown
# Roadmap
|
|
|
|
This file is the single roadmap for the C# engine, the first falling-sand game, and the experimental chunk-engine program.
|
|
|
|
Status labels:
|
|
|
|
- `[x]` done
|
|
- `[-]` partial / in progress
|
|
- `[ ]` not started
|
|
|
|
## Current State
|
|
|
|
### Repo and runtime
|
|
|
|
- `[x]` C# code split into `Sand.Core`, `Sand.App`, and `Sand.Tests`
|
|
- `[x]` dense production backend with fixed-timestep stepping, pressure, thermal, explosions, and tool fields
|
|
- `[x]` main app backend seam with dense default and chunk experimental selection via `SAND_BACKEND`
|
|
- `[x]` benchmark harness under `Sand.Benchmarks`
|
|
- `[x]` chunk residency/prototype runtime under `Sand.ChunkPrototype`
|
|
- `[x]` imported `advchksys` kept as a support/prototype asset, not the production runtime substrate
|
|
|
|
### Chunk status
|
|
|
|
- `[x]` chunk residency scaffold exists
|
|
- `[x]` chunk backend is integrated into the main app as an experimental backend
|
|
- `[x]` chunk motion-regression tests cover wake-on-paint and shimmer issues found so far
|
|
- `[x]` active-move bottleneck instrumentation completed
|
|
- `[-]` high-motion chunk workloads are materially more stable in the real main app shell, and long-press gas overload no longer easily death-spirals the app, but mixed-scene runtime hotspots remain
|
|
- `[x]` chunk runtime can attribute active-frame cost to movement / runtime / activation / render buckets
|
|
- `[-]` live-app branch metrics now identify mixed-scene full-runtime work across solids, liquids, and gases as the main remaining single-thread hotspot after gas-stress stabilization
|
|
- `[-]` recent mixed-scene live runs show healthier attempt-to-move ratios and low render cost, so the remaining work is mostly true sim/runtime cost rather than frame catch-up collapse
|
|
- `[ ]` chunk backend competitive in the real main app shell
|
|
- `[ ]` chunk-local page-step architecture fully optimized
|
|
- `[ ]` chunk dirty-page render path fully paying off in the real app
|
|
- `[x]` chunk metrics/progress log added in [`docs/chunk-engine-progress.md`](/f:/Documents/Dev/sandpypi/docs/chunk-engine-progress.md)
|
|
|
|
## Parity and Engine Gaps
|
|
|
|
### Dense/runtime gaps
|
|
|
|
- `[-]` movement-property tuning from metadata (`velocity`, `friction`, `viscosity`, `heat_capacity`)
|
|
- `[-]` pressure/breakage tuning polish
|
|
- `[ ]` deterministic snapshot capture and comparison harness
|
|
- `[ ]` richer UI/debug overlays beyond current parity level
|
|
- `[ ]` accelerator implementation behind `ISimulationAccelerator`
|
|
|
|
### Chunk/runtime gaps
|
|
|
|
- `[ ]` chunk-local contiguous hot-path storage replacing the current prototype-level iteration costs
|
|
- `[ ]` chunk-local active-band stepping and better neighbor wake scheduling
|
|
- `[ ]` chunk-aware frame generation that clearly reduces bytes touched on localized scenes
|
|
- `[ ]` parity ladder for reactions, phase transitions, thermal, burning, and explosions
|
|
- `[ ]` deterministic dense-vs-chunk snapshot parity for ported subsystems
|
|
|
|
## Next Milestones
|
|
|
|
### Dense Track
|
|
|
|
- `[-]` continue movement-property and force tuning from metadata
|
|
- `[ ]` add snapshot capture/comparison harness for named scenes
|
|
- `[ ]` keep regression coverage growing around perf-sensitive fixes
|
|
- `[ ]` stage the first accelerator backend only after snapshot coverage exists
|
|
|
|
### Chunk Engine Program
|
|
|
|
#### Chunk Program A: Truthful measurement and tracking
|
|
|
|
- `[x]` add dated chunk progress / metrics log
|
|
- `[x]` add app-sized benchmark mode matching the main app sim dimensions
|
|
- `[x]` record first dense-vs-chunk app baseline
|
|
- `[x]` split chunk measurements into clearer step-core / activation / render buckets
|
|
- `[ ]` keep milestone-relevant benchmark and app results logged in the progress doc
|
|
|
|
#### Chunk Program B: Step-core stabilization
|
|
|
|
- `[x]` remove wake-on-paint settling artifacts
|
|
- `[x]` remove trapped liquid/gas shimmer regressions currently covered by tests
|
|
- `[x]` add chunk motion-regression suite
|
|
- `[-]` continue stabilizing gas/liquid/solid motion under mixed tool-field stress
|
|
|
|
#### Chunk Program C: Chunk-local architecture rewrite
|
|
|
|
- `[x]` remove LINQ / global particle sorting from the chunk step hot path
|
|
- `[x]` introduce chunk-local page storage types and scheduler scaffolding
|
|
- `[-]` step active pages using dirty-band guidance
|
|
- `[x]` wake neighbor pages on border writes
|
|
- `[ ]` reduce remaining page-lookup and page-render overhead in real app workloads
|
|
|
|
#### Chunk Program D: Rendering + stats
|
|
|
|
- `[-]` dirty-page / dirty-chunk frame generation path
|
|
- `[x]` extend shared chunk frame stats
|
|
- `[x]` surface chunk workload metrics in the app debug overlay
|
|
- `[ ]` make localized chunk rendering wins clearly visible in app-sized measurements
|
|
|
|
#### Chunk Program E: Active-Move Optimization Gate
|
|
|
|
- `[x]` add move-attempt / move-result / stalled-motion metrics
|
|
- `[x]` add runtime bucket timing for movement / runtime / activation / field decay / render
|
|
- `[x]` add active-motion benchmark scenes and app procedures
|
|
- `[-]` reduce chunk cost on `10k-15k` simultaneous move frames
|
|
- `[x]` verify chunk remains stable under gas-heavy active scenes enough to stop easy long-press collapse
|
|
- `[x]` document high-motion baselines and improvements in the progress log
|
|
- `[-]` use the stabilized gas/app baseline to reduce remaining mixed-scene full-runtime cost before resuming parity work
|
|
|
|
#### Chunk Program F: Feature parity ladder
|
|
|
|
- `[ ]` base motion parity improvements
|
|
- `[ ]` chunk force / pressure tuning
|
|
- `[ ]` common-material phase transitions
|
|
- `[ ]` core local reactions
|
|
- `[ ]` thermal subset
|
|
- `[ ]` burning/effect subset
|
|
- `[ ]` explosion / breakage subset
|
|
|
|
#### Chunk Program G: Promotion gate
|
|
|
|
- `[ ]` sparse app workload beats dense by `>=25%`
|
|
- `[ ]` mixed app workload beats dense by `>=10%`
|
|
- `[ ]` dense-like workload remains within `15%`
|
|
- `[ ]` snapshot suite passes for all ported subsystems
|
|
|
|
## Suggested Order
|
|
|
|
1. add active-move instrumentation and logging
|
|
2. establish dense vs chunk high-motion baselines in the real app shell
|
|
3. reduce chunk active-move overhead in the step core
|
|
4. confirm gains on gas-heavy and continuous-paint scenes
|
|
5. reduce remaining mixed-scene full-runtime hotspots from the stabilized single-thread baseline
|
|
6. plan multithreaded architecture from the stabilized single-thread baseline
|
|
7. only then resume chunk parity expansion and deeper engine storage promotion
|
|
|
|
## Commands
|
|
|
|
Dense app:
|
|
|
|
```powershell
|
|
Remove-Item Env:SAND_BACKEND -ErrorAction SilentlyContinue
|
|
dotnet run --project .\Sand.App\Sand.App.csproj -c Release
|
|
```
|
|
|
|
Chunk app:
|
|
|
|
```powershell
|
|
$env:SAND_BACKEND='chunk'
|
|
dotnet run --project .\Sand.App\Sand.App.csproj -c Release
|
|
```
|
|
|
|
Benchmarks:
|
|
|
|
```powershell
|
|
dotnet run --project .\Sand.Benchmarks\Sand.Benchmarks.csproj -c Release -- --mode app-sized
|
|
```
|
|
|
|
```powershell
|
|
dotnet run --project .\Sand.Benchmarks\Sand.Benchmarks.csproj -c Release -- --mode snapshot-scenes
|
|
```
|
|
|
|
## Notes
|
|
|
|
- Dense remains the production/reference backend while chunk continues as the experimental engine lane.
|
|
- The current chunk bottleneck is high simultaneous movement volume, not simple on-screen particle count.
|
|
- Gas-stress long-press collapse is now materially harder to trigger in the main app after overload control and gas-path tuning.
|
|
- The main remaining single-thread hotspot is mixed-scene full-runtime work across solids, liquids, and gases.
|
|
- Recent live-app runs show the stable-gas case is now mostly under control; the next optimization passes should target mixed runtime-chain cost rather than reopening gas-specific hacks.
|
|
- Recent mixed-scene runs also show the overload policy is holding: frame collapse is no longer primarily coming from runaway catch-up steps, but from the simulation work itself.
|
|
- Parity work is paused behind the active-move optimization gate.
|
|
- `moves/frame` and FPS are both required signals; benchmark-only wins are not enough by themselves.
|
|
- No particle-id-specific throttles are planned; chunk optimizations need to generalize across gas/runtime-heavy materials.
|
|
- Multithreaded architecture is a follow-on goal only after the single-thread chunk step is stable, measured, and behaviorally trustworthy.
|
|
- The chunk backend is now an engine program, not a one-off feasibility toy, but it still has to beat dense under real workloads before promotion.
|
|
- `advchksys` remains a support library and reference asset, not the final Sand engine storage contract.
|