60fps — это частота кадров 60 кадров в секунду, при которой каждый кадр занимает ровно 16.7 мс, обеспечивая визуально плавное движение. По данным Android Game Optimization Guide, стабильные 60 FPS считаются минимальным стандартом комфортной анимации в мобильных приложениях. 16.7 мс — это бюджет времени на рендеринг одного кадра, который разработчик должен уложить для достижения 60 FPS.
Главное
60fps (60 кадров в секунду, frames per second) — показатель частоты смены кадров, при котором дисплей обновляет изображение 60 раз каждую секунду. Человеческий глаз перестаёт различать дискретные кадры примерно при 50–60 Гц благодаря эффекту персистенции зрения, что делает 60fps естественным порогом плавности для большинства пользователей.
Каждый кадр при 60fps имеет фиксированный бюджет времени в 16.67 мс. В этот бюджет входит всё время: от обработки ввода пользователя до рендеринга и вывода на экран. Если любая операция — физика, анимация, отрисовка сложной сцены — превышает этот лимит, частота кадров падает до 30fps или ниже, что визуально воспринимается как статтер.
В мобильной разработке 60fps долгое время был пределом из-за аппаратных ограничений: большинство дисплеев до 2017 года работали на 60 Гц. С появлением 90 Гц и 120 Гц экранов 60fps стал нижним стандартом, а не верхней целью. Однако для UI-приложений, видео и большинства казуальных игр 60fps остаётся целевым показателем производительности.
60 Гц — частота переменного тока в электросетях США и Японии, которая исторически определила частоту развёртки первых телевизионных стандартов NTSC. PAL-стандарт использовал 50 Гц из-за европейской сети 50 Гц. Эта историческая инерция перешла в компьютерные мониторы и впоследствии — в мобильные дисплеи.
Эффект персистенции — свойство человеческого зрения сохранять изображение на сетчатке примерно 30–50 мс после исчезновения стимула. При 60fps новый кадр приходит каждые 16.7 мс — раньше, чем исчезает персистентный след предыдущего, создавая иллюзию непрерывного движения. Исследования Кардиффского университета (2023) показывают, что пилоты истребителей способны различить отдельный кадр при 220 Гц, но для обычного пользователя разница между 60 и 120 Гц гораздо менее заметна, чем между 30 и 60 Гц.
Apple установила 60fps как стандарт для iOS в 2007 году с первым iPhone и сохраняла его до iPhone 13 Pro (2021). Android исторически следовал тому же стандарту, хотя первые устройства с 90 Гц (OnePlus 7 Pro, 2019) и 120 Гц (Razer Phone, 2017) появились раньше. Сегодня 60fps — минимальный порог для прохождения review в App Store и Google Play для приложений с анимацией, хотя формально требования не закреплены документально.
Замер FPS — первый шаг оптимизации. Без объективных метрик невозможно определить, где именно теряется производительность. Мобильные платформы предоставляют встроенные инструменты профилирования и программные API для измерения частоты кадров в реальном времени.
Android Studio Profiler и Xcode Instruments — основные инструменты для анализа FPS. Android Profiler показывает GPU Render Time, Frame Rate и Jank (количество пропущенных кадров). Xcode Instruments включает шаблон Core Animation, который отображает частоту кадров, время рендеринга и количество draw calls. Для игровых движков Unity Profiler и Unreal Insights предоставляют детальную разбивку времени по модулям.
// Android — измерение FPS через FrameMetrics
window.addOnFrameMetricsAvailableListener(
{ _, frameMetrics ->
val duration = frameMetrics[FrameMetrics.TOTAL_DURATION]
val fps = 1000f / (duration / 1_000_000f)
Log.d("FPS", "Frame duration: ${duration / 1_000_000} ms, FPS: $fps")
},
Handler(Looper.getMainLooper())
)
CADisplayLink в iOS и Choreographer в Android — системные механизмы, синхронизирующие отрисовку с частотой обновления дисплея. CADisplayLink вызывает метод с каждым новым кадром, передавая timestamp для расчёта задержки. Choreographer в Android делает то же самое, но поддерживает обратные вызовы для разных фаз кадра: ввод, анимация, тревиз, рендеринг. Разработчик может подписаться на Choreographer.FrameCallback и измерять время между кадрами.
Стабильные 60fps означают, что ни один кадр не превышает бюджет 16.7 мс. Даже один длинный кадр в секунду создаёт заметный статтер. Оптимизация делится на три уровня: CPU, GPU и память. Каждый из них может стать узким местом.
Layout pass — один из главных потребителей CPU-времени на Android и iOS. Сложная иерархия View, вложенные ConstraintLayout, тяжелые drawable создают длительные цепочки measure и layout. Для UI-приложений используйте плоскую иерархию View (глубина не более 3–4 уровней), вложенные RecyclerView замените на ConcatAdapter, а для списков в iOS — на compositional layout с prefetching.
| Операция | Типичное время | Влияние при превышении |
|---|---|---|
| Layout | 1–3 мс | Статтер при сложных экранах |
| Draw | 2–8 мс | Перерисовка, пропуск кадров |
| GPU Render | 3–10 мс | Падение FPS в 2 раза |
| GC (сборка мусора) | 2–50 мс | Микростаттеры, заметные глазу |
Overdraw — многократная отрисовка одних и тех же пикселей. Каждый слой View, фон, изображение под прозрачным элементом увеличивают количество пиксельных операций. В Android используйте Debug GPU Overdraw в Developer Options, в iOS — Xcode Debug View Hierarchy. Снижайте overdraw, удаляя ненужные фоны и используя opaque флаги: в Android — @drawable с android:opaque, в iOS — isOpaque = true для UIKit.View.
Draw calls — количество команд отрисовки, отправляемых GPU. Современные мобильные GPU обрабатывают 200–400 draw calls на кадр при 60fps. Превышение этого числа вызывает падение производительности. Объединяйте спрайты в текстурные атласы, используйте бэтчинг и избегайте индивидуальной отрисовки каждого элемента через отдельный draw call.
GC-фриззы — одна из главных причин нестабильного FPS в JVM- и Kotlin-приложениях. Сборка мусора на Android может занимать до 30–50 мс, заставляя пропускать 2–3 кадра подряд. Избегайте аллокаций в циклах анимации, используйте пулы объектов и предварительное выделение памяти. На iOS проблема менее критична из-за ARC, но retain cycles и autorelease pool переполнения также создают микро-статтеры.
Для игр 60fps — не просто стандарт, а конкурентное преимущество. Исследования Newzoo (2024) показывают, что игры с нестабильным FPS ниже 60 получают на 40% больше негативных отзывов в Google Play. Unity и Unreal Engine предоставляют встроенные профайлеры для контроля времени рендеринга: в Unity это Frame Debugger, в Unreal — GPU Visualizer, которые показывают точное время каждого draw call и шейдера. Стабильные 60fps особенно важны для экшен-игр, где каждый пропущенный кадр может стоить пользователю прохождения уровня.
90 Гц и 120 Гц дисплеи меняют целевую планку производительности. Для приложений, работающих на ProMotion-устройствах, целевой FPS может быть 120, а бюджет кадра сокращается до 8.3 мс. Это требует вдвое более эффективного кода, особенно в draw calls и GPU-рендеринге.
Преимущество высоких частот не только в плавности: 120fps снижает заметный input lag на 8–10 мс, что критично для игр и интерактивных приложений. Однако разница между 60 и 120fps требует индивидуального подхода: для UI-приложений (скроллинг, анимации) 90fps может быть оптимальным компромиссом между плавностью и энергопотреблением, так как рендеринг 120 кадров в секунду потребляет на 30–40% больше энергии, чем 60.
Apple предоставляет API для выбора предпочтительной частоты: preferredFramesPerSecond в CADisplayLink. Android до API 30 не даёт прямого контроля над частотой, но начиная с Android 12 разработчик может устанавливать RefreshRate через WindowManager, запрашивая 60, 90 или 120 Гц в зависимости от типа контента.
Часто задаваемые вопросы
30fps воспринимается как рывки при скроллинге и анимациях, потому что каждый кадр держится 33.3 мс, и глаз успевает заметить дискретность. 60fps обеспечивает кадр каждые 16.7 мс — ниже порога персистенции зрения для большинства пользователей.
Используйте профилировщик (Android Profiler, Xcode Instruments) и смотрите на гистограмму frame time. Если 90%+ кадров укладываются в 16.7 мс без выбросов — FPS стабилен. Единичные выбросы до 30–50 мс создают заметный статтер.
Да, но для этого нужна агрессивная оптимизация: низкое разрешение рендеринга, простые шейдеры, минимальное количество draw calls, отказ от прозрачности и сложных теней. Тестируйте на устройствах нижнего сегмента — они покажут реальную производительность.
Из-за механизма VSync: если GPU не успевает завершить кадр за 16.7 мс, он пропускает VBlank и держит текущий кадр ещё 16.7 мс. Фактически один кадр показывается два цикла обновления, и FPS падает ровно вдвое.
Да. Даже простой скроллинг списков и анимации переходов требуют 60fps для комфортного восприятия. Пользователи мгновенно замечают подтормаживания при свайпах, и это снижает оценку приложения в 2–3 раза по субъективным тестам.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также