# Туториал: отладка Babylon-сцены Полезные приёмы когда «что-то не рендерится» или «тормозит». ## 1. Inspector (визуальный debug) В Console браузера: ```js window.__scene.debugLayer.show({ embedMode: true }); ``` Откроется панель Babylon Inspector справа: - **Scene** — список всех мешей, лампочек, материалов - **Stats** — FPS, число draw calls, мегабайты в VRAM - **Performance** — graph загрузки CPU/GPU Чтобы скрыть: `__scene.debugLayer.hide()`. ## 2. Подсветить меш В Inspector кликни по мешу — он подсветится зелёным wireframe-ом на сцене. Видно где он, какого размера, не «улетел ли в космос». В коде: ```js const mesh = scene.getMeshByName('Cube1'); mesh.showBoundingBox = true; // покажет AABB mesh.material.wireframe = true; // рендер каркасом ``` ## 3. Логи FPS / draw calls ```js scene.onAfterRenderObservable.add(() => { if (scene.getEngine().performanceMonitor.averageFPS < 30) { console.warn('FPS dropped:', { fps: scene.getEngine().performanceMonitor.averageFPS, drawCalls: scene.getEngine().drawCalls, activeMeshes: scene.getActiveMeshes().length, }); } }); ``` ## 4. Профайлинг кадра В Chrome DevTools → Performance → Record (10 сек игры). Смотри: - **Scripting** > 10мс — твой JS тормозит. Гляни Bottom-Up — самые тяжёлые функции. - **Rendering** > 5мс — GPU не справляется. Уменьши число мешей или текстур. - **Painting** — обычно мало в WebGL. ## 5. Babylon Spector.js Глубокая отладка одного кадра WebGL. Установи расширение [Spector.js](https://spector.babylonjs.com/). Кнопка «Capture frame» → видишь каждый draw call, каждую текстуру, каждый shader. Полезно когда: - Странные артефакты (одна модель «мерцает») - Текстура не накладывается (видишь pink/purple) - Не понятно почему столько draw calls ## 6. Прозрачные / невидимые меши Часто меш «есть, но не видно». Чек-лист: ```js const m = scene.getMeshByName('Foo'); console.log({ isEnabled: m.isEnabled(), isVisible: m.isVisible, visibility: m.visibility, // 0 = прозрачный, 1 = непрозрачный position: m.position, scaling: m.scaling, // не 0? material: !!m.material, hasTexture: !!(m.material && m.material.diffuseTexture), textureLoaded: m.material?.diffuseTexture?.isReady(), }); ``` ## 7. Утечки памяти Каждый `scene.createMesh` без последующего `mesh.dispose()` — утечка. Проверь через Inspector → Statistics → Allocated GPU memory растёт со временем = течь. Типичные источники: - GLB загружен через `SceneLoader.ImportMesh` без `AssetContainer` — материалы и текстуры не освобождаются. - `setInterval` создающий новые меши и не убирающий старые. - Listener'ы `onClick/onPointer` накапливаются, держат refs. ## 8. Console команды для быстрой отладки ```js // Сколько мешей сейчас на сцене __scene.meshes.length // Топ-10 по числу вершин __scene.meshes.slice().sort((a,b)=> b.getTotalVertices() - a.getTotalVertices()).slice(0,10).map(m=>[m.name, m.getTotalVertices()]) // Удалить все debug-marker'ы __scene.meshes.filter(m=>m.name.startsWith('__debug_')).forEach(m=>m.dispose()) // Заморозить материалы (не пересчитывать uniforms каждый кадр) __scene.materials.forEach(m=>m.freeze()) // ! не делать если материалы меняются в runtime — иначе зависнут на текущем значении // FPS-overlay на сцене new BABYLON.FreeCamera('debug', new BABYLON.Vector3(0,5,-10), __scene); ``` ## 9. Что не делать (часто ломает FPS) - `scene.render()` руками — Babylon сам в RAF - `blockMaterialDirtyMechanism = true` — лагает новые меши (debris, эффекты) - `createOrUpdateSelectionOctree()` каждый кадр — пересчёт O(N²) - `mesh.getBoundingInfo()` в hot path — есть кеш `mesh._boundingInfo` - `setInterval(... , 16)` — используй `scene.registerBeforeRender(fn)` (тогда привязано к рендер-циклу Babylon) ## 10. Мобильная отладка Открой Chrome на десктопе → DevTools → ⋮ → More tools → Remote devices. Подключи Android через USB, открой плеер на нём — твой DevTools покажет console/network/dom мобильной вкладки. iOS аналогично через Safari → Develop → . ## Что почитать - https://doc.babylonjs.com/features/featuresDeepDive/inspector - https://spector.babylonjs.com/ - [reference_kubikon_scripting_api.md](../../disaster-recovery/...) — приватный референс API для скриптов ## Вопросы В канал `#разработка` на https://team.rublox.pro.