renderbudgetlisted
Install: claude install-skill snwlee/Nereus
# renderbudget
nereus:common 규칙을 따른다. 담당 에이전트: graphics-engineer.
구현 절차(TDD·게이트)는 **`nereus:build` 의 것을 그대로 쓴다**.
## 0. 정적 검사만으로는 모자란다
`scene-scan` 은 코드가 무엇을 *안 부르는지* 본다. 실제로 GPU 에 무엇이 남았는지는
**런타임 증거**로만 안다. 그 증거가 `renderer.info` 다.
```js
// 씬 전환·상태 복귀 지점에서 표본을 남긴다. 라벨은 "같은 상태"를 뜻한다.
samples.push({ label: "stage-1", info: JSON.parse(JSON.stringify(renderer.info)) });
```
`renderer.info` 를 읽는 곳이 하나도 없으면 `scene-scan` 이 `instrumentation-missing` 으로
잡는다. **계측 부재는 통과가 아니다** — 측정 자체가 불가능하다는 뜻이다.
## 1. 부르는 법
```bash
echo '{"samples":[{"label":"stage-1","info":{...}}],"budgets":{"calls":100}}' \
| node plugins/nereus-3d/lib/render-budget.mjs
```
```js
import { checkRenderBudget } from "./plugins/nereus-3d/lib/render-budget.mjs";
const { violations, unmeasured } = checkRenderBudget({ samples, budgets });
```
판정 축: `calls` · `triangles` · `points` · `lines` · `geometries` · `textures` · `programs`.
## 2. 예산 기본값을 여기 적지 않는다
드로우콜 상한·텍스처 예산은 **기기 등급·해상도·씬 복잡도가 정하는 운영값**이다.
스킬이나 데이터 파일에 숫자를 적으면 정책인 척하면서 낡는다
(`nereus-ads` 의 쿨다운·세션 상한과 같은 판단).
**기준을 안 주면 판정하지 않는다.** 대신 그 사실이 `unmeasured` 에 실린다.
지어낸 기준은 그럴듯하게 틀린다.
목표 기기를 정한 쪽이 자기 숫자를 넘긴다:
```json
{ "budgets": { "calls": 120, "textures": 48, "programs": 20 } }
```
## 3. 누수는 같은 라벨 두 표본 비교다
**단발 스냅샷으로 판정하지 않는다.** 지오메트리 99,999개는 누수가 아니라 큰 씬일 수 있다.
단발로 판정하면 큰 씬이 전부 빨개지고, 그러면 아무도 안 본다.
- 같은 `label` 의 표본이 **둘 이상**일 때만 본다. 같은 라벨은 "같은 상태로 돌아왔다"는 뜻이다.
- 누수 축은 `memory.geometries` 와 `memory.textures` 만이다(`three-budget.json` 의 `leakAxes`