{"schemaVersion":1,"record":{"key":"lesson/performance-budget","type":"lesson","id":"performance-budget","lang":"ru","title":"Бюджет производительности","summary":"Задаём измеримую цель, ищем узкое место профайлером и сравниваем изменения в одинаковых условиях.","updatedAt":"2026-10-20","status":"active","url":"https://gamemechanics.pro/ru/lessons/performance-budget/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/performance-budget.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/performance-budget.md","aliases":[],"tags":["performance","profiling","frame-time"],"sourceIds":["source-657cab2680b01317"],"sources":[{"id":"source-657cab2680b01317","title":"Godot: General optimization tips","url":"https://docs.godotengine.org/en/stable/tutorials/performance/general_optimization.html","verifiedAt":null}],"sections":[{"id":"prerequisites","title":"Что нужно знать","body":"Нужна запускаемая сцена и доступ к целевому устройству либо явно обозначенной промежуточной среде. Урок помогает заменить требование «сделай быстрее» на измерение конкретной нагрузки. Знания низкоуровневой оптимизации пока не нужны."},{"id":"principle","title":"Принцип","body":"Начните с платформы, разрешения, режима сборки и целевой частоты кадров. При 60 кадрах в секунду интервал между кадрами составляет примерно 16,67 мс; при 30 примерно 33,33 мс. Это арифметический ориентир для ритма кадров, а не обещание, что любая сцена успеет обработаться за это время.\n\nНе складывайте автоматически все показания CPU и GPU: их работа может перекрываться. Смотрите, что измеряет конкретный инструмент, и ищите участок, задерживающий готовность следующего кадра. Оптимизация одной функции не поможет, если задержка возникает в другом месте.\n\n[Рекомендации Godot по оптимизации](https://docs.godotengine.org/en/stable/tutorials/performance/general_optimization.html) предлагают измерять узкие места и проверять результат изменений. Они также различают постоянную медленную работу, отдельные скачки задержек и долгую загрузку. Для этих проблем нужны разные сценарии наблюдения.\n\n<span id=\"пример-арена-с-противниками\"></span>"},{"id":"example","title":"Практический пример","body":"### Арена с противниками\n\nПредположим, на спокойной сцене всё плавно, а появление группы врагов вызывает остановку. Не начинайте с переписывания движения. Создайте воспроизводимый сценарий с одинаковой ареной, числом врагов, начальным значением генератора случайности (seed) и моментом появления.\n\n```text\nscenario: spawn-wave\ndevice: exact model and power mode\nbuild: production configuration\nresolution: fixed value\nwarmup: 20 seconds\nrecord: 60 seconds\nreport: median, p95, p99 frame time and longest frame\ncompare: baseline versus one isolated change\n```\n\nЭто пример процедуры. Выберите длительность под свою игру и сохраните её одинаковой в сравнении. p95 и p99 обозначают границы, в которые укладываются примерно 95% и 99% измеренных кадров. Так проще заметить редкие долгие кадры, которые скрывает среднее. Но короткая запись всё ещё может пропустить редкий сбой.\n\nЗапишите профиль момента появления врагов. Если время уходит на создание объектов и подготовку ресурсов, проверьте предварительную загрузку или распределение работы. Если постоянно дорого стоит обновление всех объектов, изучите частоту и объём этой работы. Выбирайте исправление по профилю, а не по популярности техники."},{"id":"mistakes","title":"Частые ошибки","body":"Object pool требует корректного сброса состояния. Если после повторного использования враг сохраняет старое здоровье или подписку, ускорение не компенсирует ошибку. Проверяйте игровой результат вместе со временем.\n\nСравнение редактора с production-сборкой на другом компьютере ничего не говорит об эффекте одной правки. Фиксируйте устройство, питание, сборку, настройки и внешнюю нагрузку. Не называйте проверку на мощном ноутбуке проверкой минимального целевого устройства.\n\nНе оценивайте только FPS. Для проекта могут быть важнее первая загрузка, объём скачивания, пиковая память или время открытия меню. Выберите показатели, соответствующие наблюдаемой проблеме, и оставьте запас для обычных колебаний среды."},{"id":"checks","title":"Проверка результата","body":"- У цели указаны платформа, сцена и настройки.\n- Есть исходная запись до изменения.\n- Профиль объясняет выбор оптимизации.\n- Сравнение использует одинаковые условия и нагрузку.\n- Проверены редкие медленные кадры, а не только средний FPS.\n- Поведение игры и потребление памяти не ухудшились незаметно.\n- Непроверенные целевые устройства явно перечислены."},{"id":"agent-task","title":"Задание для ИИ-агента","body":"> Сначала зафиксируй воспроизводимый сценарий и исходные измерения. Найди главное узкое место профайлером и предложи одно небольшое изменение. Сравни время кадра в одинаковых условиях, проверь игровой результат и память. Если целевое устройство недоступно, назови ограничение и не заявляй, что его производительность подтверждена."}],"relations":[{"type":"requires","direction":"outgoing","label":"Перед началом","key":"lesson/game-loop","title":"Игровой цикл и время","url":"https://gamemechanics.pro/ru/lessons/game-loop/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/game-loop.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/game-loop.md"},{"type":"related","direction":"outgoing","label":"Связанные материалы","key":"lesson/gameplay-acceptance","title":"Проверка игрового поведения","url":"https://gamemechanics.pro/ru/lessons/gameplay-acceptance/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/gameplay-acceptance.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/gameplay-acceptance.md"},{"type":"contains","direction":"incoming","label":"Учебные маршруты","key":"path/first-prototype","title":"Первый проверяемый прототип","url":"https://gamemechanics.pro/ru/learn/first-prototype/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/path/first-prototype.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/path/first-prototype.md"},{"type":"uses","direction":"outgoing","label":"Источники в подборке","key":"resource/godot-performance","title":"Godot: измерение производительности","url":"https://gamemechanics.pro/ru/resources/#resource-godot-performance","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/resource/godot-performance.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/resource/godot-performance.md"}],"placements":[],"supersededBy":[],"attributes":{"category":"engineering","level":"intermediate","minutes":6},"endsAt":null,"provenance":"Авторский материал gamemechanics.pro. Учебные примеры требуют проверки в своём проекте.","license":"CC-BY-4.0","codeLicense":"MIT","attribution":"gamemechanics.pro contributors"}}