
Контроль частоты кадров в Unity напрямую влияет на стабильность игры и нагрузку на устройство. По умолчанию Unity не ограничивает FPS, и на мощных системах частота может превышать 300 кадров в секунду, создавая лишнюю нагрузку на процессор и видеокарту.
Для ограничения FPS используется Application.targetFrameRate. Установка этого значения на 60 позволит стабилизировать игру на мониторах с частотой 60 Гц и снизить потребление энергии на мобильных устройствах. Значение -1 оставляет FPS неограниченным, что рекомендуется только для тестирования.
Другой метод контроля – VSync, который синхронизирует кадры с обновлением монитора. Включение VSync через Quality Settings предотвращает разрывы изображения, но может увеличить задержку ввода. Для мобильных платформ часто используют сочетание VSync и ограничения targetFrameRate для оптимальной производительности.
Настройка Application.targetFrameRate для ограничения FPS

В Unity ограничение частоты кадров выполняется через свойство Application.targetFrameRate. По умолчанию оно равно -1, что означает отсутствие ограничений. Для игр на ПК с мониторами 60 Гц рекомендуется устанавливать targetFrameRate = 60, чтобы исключить лишнюю нагрузку на процессор и видеокарту.
Пример установки в скрипте: Application.targetFrameRate = 60;. Этот код лучше размещать в методе Awake или Start, чтобы значение применялось сразу после запуска сцены. На мобильных устройствах установка targetFrameRate между 30 и 60 позволяет снизить нагрев и расход батареи без заметного ухудшения плавности анимации.
Для проектов с динамической сменой сцен можно обновлять targetFrameRate в зависимости от сложности сцены. Например, в сценах с высокой детализацией рекомендуется временно снижать FPS до 45–50, чтобы сохранить стабильную производительность. После оптимизации или смены на менее нагруженную сцену можно вернуть стандартное значение.
Важно учитывать сочетание targetFrameRate и VSync. Если VSync включен, targetFrameRate автоматически ограничивается кратным частоте обновления монитора. В этом случае установка конкретного числа кадров в секунду не будет иметь эффекта, поэтому следует отключить VSync для точного контроля FPS через Application.targetFrameRate.
Использование VSync для синхронизации с монитором
Основные параметры:
- Every V Blank – каждый кадр синхронизируется с обновлением монитора. На 60 Гц это ограничивает FPS до 60.
- Don’t Sync – VSync отключен, частота кадров не ограничена, что может привести к разрывам экрана.
Рекомендации по использованию:
- Для ПК с фиксированной частотой обновления монитора включайте VSync для стабильной визуализации и снижения нагрузки на GPU.
- На мобильных устройствах комбинация VSync и Application.targetFrameRate позволяет ограничить FPS, снижая перегрев и энергопотребление.
- При включенном VSync targetFrameRate не превышает кратное значение частоты монитора, поэтому установка численного ограничения кадров может быть избыточной.
- Для игр с быстрым откликом отключайте VSync и контролируйте FPS через targetFrameRate, чтобы минимизировать задержку ввода.
Разница между FixedUpdate и Update при высокой частоте кадров

В Unity Update вызывается каждый кадр, а FixedUpdate выполняется с фиксированным интервалом времени, независимо от FPS. При высокой частоте кадров это различие становится критичным для физики и расчета движения объектов.
Основные отличия можно представить в таблице:
| Метод | Частота вызова | Назначение | Рекомендации при высоком FPS |
|---|---|---|---|
| Update | Каждый кадр (изменяется с FPS) | Обновление логики, анимаций, ввода игрока | Использовать для визуальных изменений и обработки ввода. Следить, чтобы тяжелые вычисления не перегружали CPU при 200+ FPS. |
| FixedUpdate | Фиксированный интервал (по умолчанию 0.02 с) | Расчеты физики, перемещение Rigidbody | Оставлять физику в FixedUpdate, чтобы расчеты оставались стабильными даже при скачках FPS. |
При высоком FPS важно избегать размещения физики в Update, так как это приведет к нестабильному поведению объектов и непредсказуемым столкновениям. Для точного контроля времени FixedUpdate можно изменить через Time.fixedDeltaTime, например уменьшив до 0.01 для более плавной физики на 120–240 FPS.
Оптимизация графики для поддержания стабильного FPS

Использование Level of Detail (LOD) для объектов позволяет рендерить высокополигональные модели только на близком расстоянии, а на дальнем – упрощенные версии. Это уменьшает количество полигонов, обрабатываемых за кадр, и снижает скачки FPS.
Применение Baked Lighting вместо реального освещения для статических объектов сокращает количество вычислений в режиме реального времени. Для динамических объектов рекомендуется ограничивать количество источников света и использовать Light Probes для более точного освещения без перегрузки GPU.
Сжатие и объединение Meshes уменьшает количество вызовов отрисовки (Draw Calls), что особенно важно на мобильных устройствах. Также стоит использовать Culling – исключение объектов вне камеры, чтобы не тратить ресурсы на их рендеринг.
Настройка Post-Processing должна учитывать FPS. Эффекты типа Bloom, Motion Blur и Ambient Occlusion сильно нагружают GPU, поэтому на устройствах с ограниченной производительностью лучше отключать их или использовать упрощенные версии.
Проверка текущего FPS через скрипты в Unity
Для отслеживания FPS в Unity используется вычисление частоты кадров через Time.deltaTime. Это значение показывает время в секундах между текущим и предыдущим кадром, и на его основе можно получить FPS как 1 / Time.deltaTime.
using UnityEngine;
public class FPSCounter : MonoBehaviour
{
private float timer = 0f;
private int frameCount = 0;
void Update()
{
frameCount++;
timer += Time.deltaTime;
if (timer >= 5f)
{
float fps = frameCount / timer;
Debug.Log(«Средний FPS: » + fps);
frameCount = 0;
timer = 0f;
}
}
}
Такой подход позволяет выявлять резкие падения FPS в конкретных сценах или при запуске тяжелых эффектов. Для точной диагностики рекомендуется отображать значение FPS на экран в режиме тестирования и сравнивать его с Application.targetFrameRate для корректировки настроек производительности.
Ограничение FPS на мобильных устройствах
На мобильных устройствах высокая частота кадров вызывает перегрев процессора и ускоренный разряд батареи. Оптимальный диапазон FPS для большинства смартфонов составляет 30–60 кадров в секунду.
Для ограничения FPS используется Application.targetFrameRate. Например, установка Application.targetFrameRate = 30; снижает нагрузку и поддерживает стабильную температуру устройства. Для более мощных смартфонов можно выбрать 60 FPS для плавности анимаций.
Важный момент – взаимодействие с VSync. Если VSync включен, targetFrameRate автоматически подстраивается под частоту обновления экрана. На мобильных устройствах рекомендуется отключать VSync и задавать конкретное значение targetFrameRate для точного контроля.
Также полезно динамически менять FPS в зависимости от сцены. В тяжелых сценах, где много объектов и эффектов, можно временно снижать targetFrameRate до 30–40 FPS, а при менее нагруженных сценах возвращать 50–60 FPS. Это позволяет поддерживать плавность и экономить энергию.
Использование Quality Settings для контроля производительности

В Unity Quality Settings позволяют управлять параметрами графики для разных платформ и устройств. Настройки включают уровень детализации моделей, качество текстур, тени, постобработку и VSync.
Для стабильного FPS рекомендуется создавать несколько профилей качества. Например, профиль Low может использовать меньшие текстуры, отключенные тени и упрощенные эффекты, обеспечивая 30–40 FPS на слабых устройствах. Профиль High оставляет текстуры высокого разрешения и активные эффекты, но ограничивает FPS до 60 с помощью VSync или targetFrameRate.
Важно синхронизировать Quality Settings с Application.targetFrameRate. Если профиль использует VSync, targetFrameRate автоматически подстраивается под частоту монитора. Для мобильных устройств рекомендуется отключать VSync и устанавливать targetFrameRate вручную, чтобы избежать перегрева и падений FPS.
Для динамической оптимизации можно менять профили качества в зависимости от текущей нагрузки на GPU. Например, при падении FPS ниже 45 переключать сцену на профиль Medium, а при восстановлении производительности возвращать High. Такой подход позволяет поддерживать плавность игры без резких скачков FPS.
Решение проблем с резким падением FPS в сценах
Основные методы решения:
- Оптимизация моделей: уменьшение количества полигонов и применение LOD для дальних объектов.
- Сжатие текстур: использование форматов DXT, ASTC или ETC для снижения нагрузки на видеопамять.
- Culling: исключение объектов вне камеры с помощью Occlusion Culling или Frustum Culling.
- Оптимизация освещения: замена реального освещения на Baked Lighting для статических объектов и ограничение динамических источников света.
- Упрощение эффектов: снижение качества постобработки и количество частиц в Particle System.
Дополнительно полезно использовать динамическое управление FPS через скрипты:
- Снижение targetFrameRate при высокой нагрузке сцены.
- Переключение профилей качества (Quality Settings) в зависимости от текущей частоты кадров.
- Отслеживание горячих зон в сцене с помощью Profiler и устранение узких мест в скриптах и шейдерах.
Регулярная проверка FPS в разных частях сцены и корректировка графики позволяет поддерживать стабильную производительность и минимизировать резкие падения кадров.
Вопрос-ответ:
Как в Unity ограничить FPS через скрипт?
Для ограничения кадров используется свойство Application.targetFrameRate. Например, установка Application.targetFrameRate = 60; в методе Start или Awake задает максимум 60 кадров в секунду. Это помогает снизить нагрузку на процессор и видеокарту, особенно на мобильных устройствах.
В чем разница между Update и FixedUpdate при высокой частоте кадров?
Update вызывается каждый кадр и зависит от FPS, поэтому при 200–300 кадрах в секунду его вызовы происходят чаще, чем при 60 FPS. FixedUpdate выполняется с фиксированным интервалом, по умолчанию 0.02 секунды. Для расчетов физики и перемещений объектов с Rigidbody стоит использовать FixedUpdate, чтобы поведение оставалось стабильным независимо от FPS.
Как VSync влияет на ограничение FPS в Unity?
VSync синхронизирует кадры игры с частотой обновления монитора, предотвращая разрывы изображения. Если VSync включен, targetFrameRate автоматически подстраивается под кратное значение частоты экрана. Для мобильных устройств или игр с быстрым откликом VSync лучше отключить и контролировать FPS через targetFrameRate.
Какие методы оптимизации графики помогают поддерживать стабильный FPS?
Основные методы: уменьшение разрешения текстур и использование сжатия, применение LOD для моделей, ограничение количества источников света и постобработки, включение Occlusion Culling для скрытия объектов вне камеры, объединение Mesh для снижения Draw Calls. Эти меры уменьшают нагрузку на GPU и стабилизируют частоту кадров.
Как выявить и исправить резкие падения FPS в сценах?
Для диагностики используют Profiler и скрипты для отслеживания FPS. Частые причины падений: сложные модели, большое количество полигонов, интенсивные эффекты постобработки, динамическое освещение. Решение включает оптимизацию моделей и текстур, настройку LOD, снижение качества эффектов, включение culling и динамическое изменение targetFrameRate или профиля качества через Quality Settings.
Как ограничить FPS в Unity на мобильных устройствах без VSync?
Для точного контроля частоты кадров на мобильных устройствах VSync стоит отключить и использовать Application.targetFrameRate. Например, установка Application.targetFrameRate = 30; ограничит FPS до 30, снизит нагрев процессора и уменьшит расход батареи. В тяжелых сценах можно динамически изменять targetFrameRate в зависимости от нагрузки.
Почему игра ведет себя по-разному при высокой частоте кадров, и как это связано с Update и FixedUpdate?
Update вызывается каждый кадр, поэтому при 200–300 FPS логика и обработка ввода выполняются чаще, чем при 60 FPS. FixedUpdate вызывается с фиксированным интервалом, обычно 0.02 секунды, и предназначен для физики и перемещений объектов с Rigidbody. Если физику обрабатывать в Update, объекты могут прыгать или нестабильно сталкиваться при высокой частоте кадров. Для точного поведения физики стоит использовать FixedUpdate и, при необходимости, корректировать Time.fixedDeltaTime.
