Frame Rate — ay ang bilang ng mga frame na ipinapakita ng graphic system sa isang segundo. Sa mga mobile app, ang rate ng frame ay direktang tumutukoy sa kinis ng mga animation, pag-scroll at mga transition sa pagitan ng mga screen. Ayon sa datos ng Android Developers, 2025, ang target na Frame Rate ay 60 fps para sa mga karaniwang display at 120 fps para sa mga device na may mataas na refresh rate. Ang paglihis mula sa target na halaga ay humahantong sa mga visual na pagkautal at pagkasira ng karanasan ng gumagamit.
Mga pangunahing punto
Frame Rate (rate ng frame) — ay isang metrik na sinusukat sa mga frame bawat segundo (fps) na nagpapakita kung gaano kadalas bawat segundo ina-update ng app ang imahe sa screen. Ang mata ng tao ay nakakakita ng paggalaw bilang makinis mula sa 24 fps (pelikula), ngunit para sa interaktibong UI kinakailangan ang minimum na 60 fps upang ang mga pagpindot at animation ay maramdaman agad. Ang bawat frame ay isang kumpletong siklo: pagproseso ng input ng gumagamit, pagkalkula ng Layout, rendering ng View hierarchy at output sa screen. Kung ang alinman sa mga yugto ay lumampas sa inilaang badyet ng oras (16.6 ms sa 60 fps), ang frame ay lalaktawan at makikita ng gumagamit ang pagkautal.
Mahalagang makilala ang Frame Rate ng app mula sa refresh rate ng display (Refresh Rate). Ang refresh rate ay isang katangian ng screen: gaano kadalas bawat segundo pisikal na nire-refresh ng display ang imahe (60, 90, 120 o 144 Hz). Frame Rate — ay kung gaano karaming frame bawat segundo ang kayang i-render ng app. Kung ang app ay gumagawa ng 60 fps sa isang 120 Hz display, bawat pangalawang frame ay didoblehin — ang imahe ay mananatiling makinis, ngunit hindi gaanong responsibo kaysa sa maaari. Ayon sa Google I/O 2023, ang mga modernong flagship ay kayang mapanatili ang 120 fps sa mga simpleng UI scenario, ngunit sa mabibigat na pagkarga (mga laro, kumplikadong listahan) ang rate ay bumababa sa 40–60 fps.
Ang rendering ng frame sa isang mobile app ay dumadaan sa pipeline ng ilang yugto. Sa Android, ang pipeline ay kinabibilangan ng: pagproseso ng input (Input), animation (Animation), pagsukat at pag-aayos (Layout), pagguhit (Draw), pag-sync sa GPU at output sa screen (Swap). Bawat yugto ay isinasagawa sa CPU o GPU, at ang kabuuang oras ng lahat ng yugto ay hindi dapat lumampas sa badyet ng frame. Para sa 60 fps ang badyet ay 16.6 ms, para sa 120 fps — 8.3 ms. Choreographer (Android) at CADisplayLink (iOS) ay nag-sync ng rendering sa vertical refresh ng display (VSync), na ginagarantiya na ang frame ay ipinapakita lamang sa sandali ng pag-refresh ng screen, iniiwasan ang pagkapunit ng imahe (tearing).
Sa iOS, ang pipeline ay katulad: Run Loop ay nagpoproseso ng mga kaganapan, Core Animation ay nagkalkula ng mga layer, Render Server (isang hiwalay na proseso) ay nagre-render at nagpapadala ng frame sa GPU. Ang pagkakaiba ng iOS — ang hiwalay na proseso ng Render Server na naghihiwalay ng rendering mula sa pangunahing app. Kung i-block ng app ang main thread, maaari pa ring ipakita ng Render Server ang huling kilalang frame, ngunit titigil ang mga animation. Kung ang Render Server mismo ay hindi maka-keep up — ang GPU ay idle at bumababa ang Frame Rate. Ayon sa Apple WWDC 2022, ang pinakakaraniwang dahilan ng mababang Frame Rate sa iOS ay labis na nesting ng CALayer, mabibigat na shadowPath at offscreen rendering.
Ang code sa Kotlin ay nag-subscribe sa Choreographer.FrameCallback at nagla-log ng aktwal na oras sa pagitan ng mga frame. Kung ang interval ay lumampas sa 16.6 ms — isang nalaktawang frame ang naitatala.
class FrameRateMonitor {
private var lastFrameTime = 0L
private val frameCallback =
Choreographer.FrameCallback { frameTimeNanos ->
if (lastFrameTime != 0L) {
val deltaMs = (frameTimeNanos - lastFrameTime) / 1_000_000f
if (deltaMs > 16.6f) {
Log.w("FrameRate",
"Skipped frame: $deltaMs ms")
}
}
lastFrameTime = frameTimeNanos
Choreographer.getInstance()
.postFrameCallback(this)
}
fun start() {
Choreographer.getInstance()
.postFrameCallback(frameCallback)
}
}
Refresh Rate (rate ng pag-refresh) — ay isang hardware na katangian ng display na tumutukoy kung gaano kadalas bawat segundo pisikal na iginuhit muli ng screen ang imahe. Ang mga karaniwang display ay may 60 Hz, ang mga modernong flagship — 90, 120 o 144 Hz. Ang Frame Rate ng app ay maaaring mas mababa, katumbas o mas mataas sa refresh rate (sa huling kaso, ang mga sobrang frame ay itinatapon). Ang ideal na scenario — ang Frame Rate ay tumutugma sa Refresh Rate: bawat hardware cycle ay tumatanggap ng bagong frame mula sa app at ang paggalaw ay pinakamakinis. Kung mas mababa ang Frame Rate, inuulit ng display ang huling frame, na nararamdaman bilang micro-kautal (stutter).
Sinusuportahan ng Android at iOS ang dynamic na paglipat ng refresh rate. Ang Android 12+ ay gumagamit ng Smart Refresh Rate: sa pag-scroll, itinataas ng system ang rate sa 120 Hz, sa static na nilalaman ibinababa sa 60 Hz upang makatipid ng baterya. Ang iOS ProMotion (iPhone 13 Pro at mas bago) ay gumagana nang katulad — ang rate ay nag-iiba mula 10 hanggang 120 Hz depende sa nilalaman. Dapat suriin ng developer kung sinusuportahan ng device ang mataas na rate at iakma ang badyet ng oras bawat frame. Kung hindi kayang i-render ng app ang frame sa loob ng 8.3 ms (para sa 120 Hz), mas mainam na pilitin na gumana sa 60 Hz — ito ay magbibigay ng matatag na Frame Rate na walang mga nalaktawang frame.
| Uri ng display | Refresh Rate | Badyet bawat frame | Mga device |
|---|---|---|---|
| Karaniwan | 60 Hz | 16.6 ms | Karamihan sa Android/iOS |
| Mataas | 90 Hz | 11.1 ms | OnePlus, Pixel 6+ |
| Flagship | 120 Hz | 8.3 ms | iPhone Pro, Galaxy S22+ |
| Paglalaro | 144 Hz | 6.9 ms | ROG Phone, Nubia RedMagic |
Para sa pagsukat ng Frame Rate sa mga mobile app, available ang parehong built-in na tool ng mga platform at third-party na profiler. Sa Android, ang pangunahing tool ay GPU Profiling (Developer Options → Profile GPU Rendering) na nagpapakita ng time scale ng bawat frame na may paghihiwalay ayon sa yugto (Draw, Prepare, Process, Execute). Ang mas detalyadong pagsusuri ay ibinibigay ng Android Studio Profiler — nagre-record ito ng kumpletong profile ng rendering na may pagtukoy ng mga partikular na View na nagdudulot ng pag-redraw. Sa iOS, ginagamit ang Instruments na may template na Core Animation — nagpapakita ito ng FPS, oras ng rendering ng mga layer at bilang ng offscreen rendering.
Para sa pag-monitor ng Frame Rate sa produksyon, ginagamit ang Firebase Performance (Android) — kinokolekta nito ang Frame Rate sa background at ini-aggregate ayon sa device, bersyon ng OS at session. Sa iOS, ang MetricKit ay nagbibigay ng katulad na data sa pamamagitan ng MXAnimatoryMetric. Para sa mga laro at Flutter app, ginagamit ang FrameTimingCallback (Flutter) at Unity Profiler. Mahalagang sukatin hindi ang average na Frame Rate, kundi ang mga percentile: P50, P90 at P99. Ang app ay maaaring magpakita ng average na 55 fps, ngunit may P99 = 30 fps — ibig sabihin nito na 1% ng oras nakikita ng mga gumagamit ang matinding pagkautal at ito ay sapat para sa mga negatibong review.
Ang halimbawa sa Dart ay nagpapakita kung paano mag-subscribe sa FrameTimingCallback sa Flutter at mag-log ng bilang ng mga nalaktawang frame. Ang callback ay na-trigger pagkatapos ng bawat natapos na frame.
import 'package:flutter/scheduler.dart';
class FrameRateLogger {
int totalFrames = 0;
int missedFrames = 0;
void start() {
SchedulerBinding.instance
.addTimingsCallback(_onReportTimings);
}
void _onReportTimings(List<FrameTiming> timings) {
for (final timing in timings) {
totalFrames++;
if (timing.totalSpan()
> Duration(milliseconds: 16)) {
missedFrames++;
}
}
debugPrint("FPS: \${totalFrames - missedFrames}");
}
}
Ang pag-optimize ng Frame Rate ay nagsisimula sa pagtukoy ng mga bottleneck sa pipeline ng rendering. Sa yugto ng Layout, ang mga pangunahing problema ay labis na nesting ng View hierarchy, paggamit ng mga relative Layout (RelativeLayout na may maraming patakaran) at madalas na pagtawag sa requestLayout. Solusyon — gumamit ng ConstraintLayout o flat hierarchy, iwasan ang nesting ng higit sa 5–6 na antas. Sa yugto ng Draw — pag-redraw (overdraw): kapag ang isang pixel ay iginuhit nang maraming beses bawat frame. Halimbawa, puting background ng Activity sa ilalim ng semi-transparent na fragment, sa ilalim nito ay isa pang layer — bawat pixel ay iginuhit nang tatlong beses. Ang tool na Debug GPU Overdraw ay nagpapakita ng mga problemang zone na may indikasyon ng kulay. Inirerekomenda na panatilihin ang overdraw sa antas na 2x o mas mababa.
Sa iOS, ang mga pangunahing problema ay mabibigat na cornerRadius at masksToBounds — nagdudulot ito ng offscreen rendering, kung saan ang Core Animation ay gumagawa ng pansamantalang buffer, gumuguhit dito, pagkatapos ay kinokopya ang resulta sa screen. Ang offscreen rendering ay madaling makita sa Instruments Core Animation: kung ang Renderer na linya ay pula — may mga problema. Solusyon — gumamit ng UIImageView na may mga pre-crop na imahe sa halip na cornerRadius, iwasan ang groupOpacity at shouldRasterize nang walang matinding pangangailangan. Para sa parehong platform, ang pag-minimize ng bilang ng mga tawag sa invalidate() at setNeedsDisplay() ay kritikal — bawat ganoong tawag ay nagsisimula ng kumpletong siklo ng pag-redraw ng view.
Ang code ay nagpapakita ng pagpapalit ng malalim na nesting ng RelativeLayout ng flat na istraktura ng ConstraintLayout. Ang pagbawas ng antas ng nesting mula 4 hanggang 1 ay nagpapaikli ng oras ng Layout ng 30–50%.
// Halimbawa: flat na istraktura sa pamamagitan ng ConstraintLayout
class OptimizedView(context: Context) :
ConstraintLayout(context) {
private val binding =
ItemProfileBinding.inflate(
LayoutInflater.from(context)
)
fun bind(user: User) {
binding.avatar.setImageURI(user.avatarUrl)
binding.nameText.text = user.name
// pag-binding ng data nang hindi iginuguhit muli ang buong container
}
}
Ang mga modernong mobile app ay lalong gumagamit ng adaptibong Frame Rate — isang sistema na dynamic na nag-aayos ng target na rate sa kasalukuyang scenario. Sa mabilis na pag-scroll, ang listahan ay nangangailangan ng 120 fps para sa kinis, sa static na screen sapat na ang 60 fps o kahit 30 fps para sa video. Sa Android, ang adaptasyon ay ipinapatupad sa pamamagitan ng Choreographer.setFrameInterval (API 33+) at Window.setFrameRate. Maaaring ipahiwatig ng developer ang gustong rate sa system: setPreferredRefreshRate sa SurfaceView o setFrameRate sa Window. Ang iOS ay awtomatikong namamahala ng rate sa pamamagitan ng ProMotion, ngunit maaaring tahasang itakda ng developer ang preferredFramesPerSecond para sa CADisplayLink.
Ang Dynamic Frame Rate ay lalong mahalaga para sa mga laro at app na may mga animation. Ayon sa datos ng Google, ang pagbaba ng Frame Rate mula 120 hanggang 60 Hz sa static na screen ay nakakatipid ng hanggang 30–40% na enerhiya ng GPU. Upang makamit ang pinakamahusay na balanse sa pagitan ng kinis at konsumo ng kuryente, inirerekomenda: sukatin ang aktwal na Frame Rate sa iba't ibang scenario, itakda ang target na fps depende sa scene (laro — 60, menu — 30, video — 24) at lumipat ng mga mode sa pamamagitan ng Lifecycle-aware na mga component, upang ang app kapag na-minimize ay hindi mag-aksaya ng resources sa pag-render ng 120 fps sa background.
Ang code sa Swift ay nagtatakda ng preferredFramesPerSecond para sa CADisplayLink sa iOS. Sa pag-scroll, ang rate ay tumataas sa 120 Hz, sa pagtigil — bumababa sa 60 Hz.
class AdaptiveFrameRateManager {
private var displayLink: CADisplayLink?
func startWithHighRate() {
displayLink = CADisplayLink(
target: self,
selector: #selector(step)
)
if #available(iOS 15.0, *) {
displayLink?.preferredFrameRateRange =
CAFrameRateRange(
minimum: 60,
maximum: 120,
preferred: 120
)
}
displayLink?.add(to: .current,
forMode: .common)
}
@objc
private func step() {
// pag-update ng animation
}
}
Mga madalas itanong
Frame Rate — kung gaano karaming frame bawat segundo ang nire-render ng app. Refresh Rate — gaano kadalas bawat segundo pisikal na nire-refresh ng display ang imahe. Kapag ang Frame Rate ay mas mababa sa Refresh Rate, inuulit ng display ang huling frame.
Gamitin ang GPU Profiling sa Developer Options, Android Studio Profiler o Firebase Performance. Para sa programmatic na pagsukat — Choreographer.FrameCallback na may pagkalkula ng interval sa pagitan ng mga frame.
Overdraw — pagguhit ng parehong pixel nang maraming beses bawat frame. Bawat karagdagang layer ay nagpapataas ng oras ng Draw phase at nagpapababa ng Frame Rate. Ang optimal na overdraw ay 2x, kritikal — 4x at mas mataas.
Sa static na nilalaman, ang Dynamic Frame Rate ay nagpapababa ng rate sa 30–60 Hz, binabawasan ang load ng GPU ng 30–40%. Sa pag-scroll, ang rate ay tumataas sa 90–120 Hz para sa kinis.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din