# Real-time Performance Budget (project-scoped) Sets the budgets and verification routine for the LaparoscopicSurgeryEmulation scene. ## When to use Load after any visual, hierarchy, material, lighting, or post-processing change, or when diagnosing "scene feels heavy" / "frame rate dropped" reports. ## Per-frame budget | Resource | Budget | Notes | |---|---|---| | Triangle count (visible) | ≤ 250k | Cavity is small; most triangles should be culled | | Draw calls (visible) | ≤ 200 | Static batching helps | | SetPass calls | ≤ 100 | Raised by unique shaders / materials | | Real-time lights (visible) | ≤ 4 | One key, one fill, two rims; everything else baked | | Reflection probes (visible) | ≤ 1 | One cavity probe at 256² | | Texture memory (visible) | ≤ 64 MB | Mostly mucosa + organ textures | | Post-processing overrides | ≤ 8 | Bloom + Vignette + DoF + Tonemapping + ColorAdjustments + LensDistortion + ChromaticAberration + FilmGrain = 8 | | Render scale | ≤ 1.25 | Bumping to 1.5+ to "fix" softness is a landmine | | MSAA | ≤ 4× | 2× is the safe default | | Volume profiles (active global) | ≤ 1 | Multiple globals cause blending surprises | Flag any budget at 80% capacity as a **warning** (not a fail). ## Texture budget | Texture role | Max size | Format | |---|---|---| | Mucosa base (`TissueMucosa.png`) | 2048 | BC7 (desktop) or ASTC (mobile) | | Mucosa normal | 2048 | BC5 / ASTC normal | | Organ diffuse | 2048 | BC7 / ASTC | | Organ normal | 2048 | BC5 / ASTC normal | | Organ roughness | 1024 | BC4 / ASTC (single channel) | | Decals (if added) | 512 | BC7 / ASTC | Verify import settings on any new/modified texture: - sRGB on for colour, off for normal/roughness/AO. - Correct texture type (Default vs Normal map vs Single Channel). - Generate Mip Maps: on. - Max Size within budget. ## Shader cost - Default: URP/Lit. URP/Simple Lit only as non-hero fallback. URP/Unlit only for HUD/debug. - Custom shaders (`RenderDepth.shader`, `BlendShader.compute`) are constrained to depth/WebRTC pipelines — do not extend for visual work without a bounded change. - Minimize material keywords: every enabled keyword adds a shader variant. ## Verification routine Run after every bounded change: 1. `mcp__UnityMCP__read_console(types=["error","warning"], count=50, include_stacktrace=true)`. 2. `mcp__UnityMCP__find_gameobjects(search_term="SurgeryBenchmark", search_method="by_path", include_inactive=true)` — confirm authored roots. 3. `mcp__UnityMCP__manage_profiler(action="profiler_get_counters", category="Render")` — check draw calls, SetPass, triangles. 4. `mcp__UnityMCP__manage_graphics(action="stats_get")` — confirm texture memory. 5. Two screenshots: scope angle + 30–45° offset. ## Scene-cleanliness checks - Missing references (from `read_console`). - Empty containers with no authored purpose. - Objects outside `SurgeryBenchmark/` that are not the preserved `MainScene` subtrees. - Duplicate or stray `.mat` files not in the five-canonical-materials inventory. - Unused textures > 512px in `Assets/Materials/` or `Assets/Textures/`. ## Verdict levels - **PASS** — inside budget and visually intact. - **WARNING** — one or more budgets at 80–100%; no regression; note for next agent. - **REGRESSED** — a budget was inside before the last change and is now exceeded. Request a rollback from unity-execution. - **FAIL** — a budget was already exceeded before the last change, or a regression is severe. Escalate; do not paper over.