60fps — је фреквенција 60 кадрова у секунди, при којој сваки кадар траје тачно 16.7 ms, обезбеђујући визуелно глатко кретање. Према Android Game Optimization Guide, стабилних 60 FPS се сматра минималним стандардом комфортне анимације у мобилним апликацијама. 16.7 ms — је буџет времена за рендеровање једног кадра који програмер мора да задовољи да би постигао 60 FPS.
Главно
60fps (60 кадрова у секунди, frames per second) — показатељ фреквенције измене кадрова, при којој дисплеј освежава слику 60 пута сваке секунде. Људско око престаје да разликује дискретне кадрове при око 50–60 Hz захваљујући ефекту персистенције вида, што чини 60fps природним прагом глаткоће за већину корисника.
Сваки кадар при 60fps има фиксни буџет времена од 16.67 ms. Овај буџет укључује све време: од обраде улаза корисника до рендеровања и излаза на екран. Ако било која операција — физика, анимација, цртање сложене сцене — премаши овај лимит, фреквенција кадрова пада на 30fps или ниже, што се визуелно перципира као муцкање.
У мобилном развоју 60fps је дуго био граница због хардверских ограничења: већина дисплеја до 2017. године радила је на 60 Hz. Са појавом екрана од 90 Hz и 120 Hz, 60fps је постао доњи стандард, а не горњи циљ. Међутим, за UI апликације, видео и већину казуалних игараца 60fps остаје циљни показатељ перформанси.
60 Hz — фреквенција наизменичне струје у електричним мрежама САД и Јапана, која је историјски одредила фреквенцију скенирања првих телевизијских стандарда NTSC. PAL стандард је користио 50 Hz због европске мреже од 50 Hz. Ова историјска инерција прешла је на компјутерске мониторе и затим на мобилне дисплеје.
Ефекат персистенције — својство људског вида да задржи слику на мрежњачи око 30–50 ms након нестанка надражаја. При 60fps, нови кадар стиже сваких 16.7 ms — пре него што нестане персистентни траг претходног кадра, стварајући илузију непрекидног кретања. Истраживања Универзитета у Кардифу (2023) показују да пилоти ловаца могу да разликују појединачни кадар на 220 Hz, али за обичног корисника разлика између 60 и 120 Hz је много мање приметна него између 30 и 60 Hz.
Apple је поставио 60fps као стандард за iOS 2007. године са првим iPhone-ом и задржао га до iPhone 13 Pro (2021). Android је историјски пратио исти стандард, иако су се први уређаји са 90 Hz (OnePlus 7 Pro, 2019) и 120 Hz (Razer Phone, 2017) појавили раније. Данас је 60fps минимални праг за пролазак ревије у 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-у ради исто, али подржава повратне позиве за различите фазе кадра: улаз, анимација, treviz, рендеровање. Програмер може да се претплати на Choreographer.FrameCallback и мери време између кадрова.
Стабилних 60fps значи да ниједан кадар не прелази буџет од 16.7 ms. Чак и један дуг кадар у секунди ствара приметно муцкање. Оптимизација се дели на три нивоа: 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 ms | Муцкање код сложених екрана |
| Draw | 2–8 ms | Прецртавање, прескакање кадрова |
| GPU Render | 3–10 ms | Пад FPS на пола |
| GC (сакупљање смећа) | 2–50 ms | Микро-муцкања видљива оку |
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. Прекорај овог броја изазива пад перформанси. Спајајте sprite-ове у текстурне атласе, користите batching и избегавајте појединачног цртања сваког елемента кроз посебан draw call.
GC застоји — један од главних разлога нестабилног FPS-а у JVM и Kotlin апликацијама. Сакупљање смећа на Android-у може да траје 30–50 ms, изазивајући прескакање 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-а и shader-а. Стабилних 60fps је посебно важан за акционе игре, где сваки прескочени кадар може да кошта корисника пролазак нивоа.
Екрани од 90 Hz и 120 Hz мењају циљну лествицу перформанси. За апликације које раде на ProMotion уређајима, циљни FPS може бити 120, а буџет кадра се смањује на 8.3 ms. Ово захтева два пута ефикаснији код, посебно у draw calls и GPU рендеровању.
Предност високих фреквенција није само у глаткоћи: 120fps смањује приметно кашњење уноса за 8–10 ms, што је критично за игре и интерактивне апликације. Међутим, разлика између 60 и 120fps захтева индивидуални приступ: за UI апликације (скроловање, анимације) 90fps може бити оптималан компромис између глаткоће и потрошње енергије, јер рендеровање 120 кадрова у секунди троши 30–40% више енергије него 60.
Apple пружа API за избор преференцијалне фреквенције: preferredFramesPerSecond у CADisplayLink-у. Android до API 30 не пружа директну контролу над фреквенцијом, али од Android 12 програмер може да постави RefreshRate путем WindowManager-а, захтевајући 60, 90 или 120 Hz у зависности од типа садржаја.
Често постављана питања
30fps се перципира као трзаји приликом скроловања и анимација, јер сваки кадар траје 33.3 ms, и око успева да примети дискретност. 60fps осигурава кадар сваких 16.7 ms — испод прага персистенције вида за већину корисника.
Користите профилер (Android Profiler, Xcode Instruments) и гледајте хистограм frame time. Ако 90%+ кадрова стаје у 16.7 ms без скокова — FPS је стабилан. Појединачни скокови до 30–50 ms стварају приметно муцкање.
Да, али за то је потребна агресивна оптимизација: ниска резолуција рендеровања, једноставни шејдери, минималан број draw calls, одрицање од прозирности и сложених сенки. Тестирајте на уређајима нижег ранга — они ће показати реалну перформансу.
Због механизма VSync: ако GPU не успе да заврши кадар за 16.7 ms, пропушта VBlank и задржава тренутни кадар још 16.7 ms. Фактички један кадар се приказује два циклуса освежавања, и FPS пада тачно на пола.
Да. Чак и једноставно скроловање листи и анимације преласка захтевају 60fps за комфортно доживљавање. Корисници одмах примећују успорена приликом swipe-ова, и то смањује оцену апликације 2–3 пута у субјективним тестовима.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође