# Отладка — `$.debug` и `$.console`

```js
$.debug.on();                                     // оверлей движка (то же, что F1)
$.debug.draw.rect(10, 10, 40, 40, 'red');
$.debug.watch('hp', () => $('#hero').hp());       // значение в оверлее
$.debug.profile();                                // зоны кадра: UPDATE/RENDER_JS/PHYSICS/…
$.console.register('spawn', (args) => $('<enemy>').at(args[0], args[1]));
$.console.run('spawn 100 200');
```

---

## 1. Методы `$.debug`

| Вызов | Смысл |
|---|---|
| `on()` / `off()` / `toggle()` / `isOn()` | оверлей |
| `draw.rect/line/circle/ring/text/arrow(...)` | рисование поверх кадра |
| `watch(name, fn)` / `unwatch(name)` / `watches()` | значения в оверлее |
| `profile()` / `profileReset()` / `profiling(on)` | замеры кадра: зоны, GPU, пики (у `profile()` аргументов нет) |
| `queryStats()` | диагностика последнего нативного запроса (`$().within`, `engine.queryCircle`) |
| `stats()` / `counters()` / `limits()` / `textures()` | счётчики, занятость и потолки таблиц |
| `render()` | факты рендера кадра: `{ info, depth }` — пост-обработка, bloom, проходы и состояние меша/z-буфера; без движка — `null` |
| `memory()` | факты о JS-куче: `{ bytes, used, objects, arrays, strings, atoms, shapes, native_tweens }` (QuickJS `JS_ComputeMemoryUsage`); без движка — `null`. Растущее `objects` между кадрами — утечка, а не шум |
| `nativePasses(on?)` | нативные проходы кадра (`src/nodes.c`): синк физики, события мира, наведение, сортировка и сборка батча. `false` возвращает прежний JS-путь — для сверки «C против JS»; без аргумента — включены ли сейчас (`true` по умолчанию в движке, `false` без движка) |
| `profiler.on(on?)` / `isOn()` | покадровый профайлер подсистем: включить (без аргумента), выключить `on(false)`, прочитать состояние |
| `profiler.start/end/record/report/reset` | свои замеры; время — `$.time.perfNow()` |

## 2. Методы `$.console`

| Вызов | Смысл |
|---|---|
| `register(name, fn, help?)` | своя команда: получает массив аргументов |
| `unregister(name)` / `list()` / `help(name)` | снять команду, перечислить, показать справку |
| `run(text)` | выполнить строку как команду |

Команды — свой мини-терминал: `$.console.run('spawn 100 200')` разбирает строку
на имя и аргументы.

## 3. Ограничения

* **оверлей — RmlUi DevTools**: F1, `--overlay` и `$.debug.on()` используют одну панель; без RmlUi она недоступна. `isOn()` возвращает фактическую видимость;
* **рисование поверх кадра отключается с пост-обработкой** — отладочные фигуры
  идут в тот же проход, что и сцена;
* **профайлер замеряет участки**, а не отдельные вызовы: вложенные замеры
  складываются в один;
* **консоль без истории и автодополнения**: это вызов команды, а не REPL.

`textures()` возвращает метаданные живых GPU-текстур `{id,name,width,height}`.
Панель показывает профиль, статистику, текстуры, watches и `$.script.error()`,
позволяет применить гравитацию общего мира и запросить reload на границе кадра.
