60fps è una frequenza di 60 fotogrammi al secondo, in cui ogni fotogramma richiede esattamente 16,7 ms, garantendo un movimento visivamente fluido. Secondo la Android Game Optimization Guide, 60 FPS stabili sono considerati lo standard minimo per un'animazione confortevole nelle applicazioni mobili. 16,7 ms è il budget di tempo per il rendering di un singolo fotogramma che lo sviluppatore deve rispettare per raggiungere 60 FPS.
Punti chiave
60fps (60 fotogrammi al secondo, frames per second) è una misura della frequenza dei fotogrammi con cui il display aggiorna l'immagine 60 volte ogni secondo. L'occhio umano smette di distinguere i fotogrammi discreti a circa 50–60 Hz grazie all'effetto di persistenza della visione, rendendo 60fps una soglia naturale di fluidità per la maggior parte degli utenti.
Ogni fotogramma a 60fps ha un budget di tempo fisso di 16,67 ms. Questo budget include tutto: dall'elaborazione dell'input utente al rendering e all'output sullo schermo. Se qualsiasi operazione — fisica, animazione, rendering di una scena complessa — supera questo limite, la frequenza dei fotogrammi scende a 30fps o inferiore, percepita visivamente come balbettio.
Nello sviluppo mobile, 60fps è stato a lungo il limite a causa dei vincoli hardware: la maggior parte dei display prima del 2017 funzionava a 60 Hz. Con l'avvento degli schermi a 90 Hz e 120 Hz, 60fps è diventato lo standard inferiore piuttosto che l'obiettivo superiore. Tuttavia, per le applicazioni UI, i video e la maggior parte dei giochi occasionali, 60fps rimane l'indicatore target delle prestazioni.
60 Hz è la frequenza della corrente alternata nelle reti elettriche di Stati Uniti e Giappone, che ha storicamente determinato la frequenza di aggiornamento dei primi standard televisivi NTSC. Lo standard PAL utilizzava 50 Hz a causa della rete europea a 50 Hz. Questa inerzia storica è passata ai monitor dei computer e successivamente ai display mobili.
L'effetto di persistenza è una proprietà della visione umana che trattiene un'immagine sulla retina per circa 30–50 ms dopo la scomparsa dello stimolo. A 60fps, un nuovo fotogramma arriva ogni 16,7 ms — prima che la traccia persistente del precedente scompaia, creando l'illusione del movimento continuo. Studi dell'Università di Cardiff (2023) mostrano che i piloti di caccia possono distinguere un singolo fotogramma a 220 Hz, ma per l'utente medio, la differenza tra 60 e 120 Hz è molto meno evidente che tra 30 e 60 Hz.
Apple ha stabilito 60fps come standard per iOS nel 2007 con il primo iPhone e lo ha mantenuto fino all'iPhone 13 Pro (2021). Android ha storicamente seguito lo stesso standard, sebbene i primi dispositivi con 90 Hz (OnePlus 7 Pro, 2019) e 120 Hz (Razer Phone, 2017) siano apparsi prima. Oggi, 60fps è la soglia minima per superare la revisione dell'App Store e di Google Play per le applicazioni con animazioni, sebbene i requisiti formali non siano documentati.
La misurazione degli FPS è il primo passo dell'ottimizzazione. Senza metriche oggettive, è impossibile determinare dove si perde prestazioni. Le piattaforme mobili forniscono strumenti di profilazione integrati e API software per misurare la frequenza dei fotogrammi in tempo reale.
Android Studio Profiler e Xcode Instruments sono i principali strumenti per l'analisi degli FPS. Android Profiler mostra il tempo di rendering GPU, la frequenza dei fotogrammi e il Jank (numero di fotogrammi persi). Xcode Instruments include il modello Core Animation, che visualizza la frequenza dei fotogrammi, il tempo di rendering e il numero di draw call. Per i motori di gioco, Unity Profiler e Unreal Insights forniscono ripartizioni dettagliate del tempo per modulo.
// Android — misurazione degli FPS tramite 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 su iOS e Choreographer su Android sono meccanismi di sistema che sincronizzano il rendering con la frequenza di aggiornamento del display. CADisplayLink chiama un metodo a ogni nuovo fotogramma, passando un timestamp per il calcolo del ritardo. Choreographer su Android fa lo stesso ma supporta callback per diverse fasi del fotogramma: input, animazione, attraversamento, rendering. Lo sviluppatore può iscriversi a Choreographer.FrameCallback e misurare il tempo tra i fotogrammi.
60fps stabili significa che nessun fotogramma supera il budget di 16,7 ms. Anche un singolo fotogramma lungo al secondo crea un balbettio evidente. L'ottimizzazione si divide in tre livelli: CPU, GPU e memoria. Ognuno di essi può diventare un collo di bottiglia.
Il passaggio di layout è uno dei principali consumatori di tempo CPU su Android e iOS. Gerarchie di View complesse, ConstraintLayout annidati e drawable pesanti creano lunghe catene di measure e layout. Per le applicazioni UI, utilizza una gerarchia di View piatta (profondità non superiore a 3–4 livelli), sostituisci i RecyclerView annidati con ConcatAdapter e per le liste su iOS — utilizza compositional layout con prefetching.
| Operazione | Tempo tipico | Impatto in caso di superamento |
|---|---|---|
| Layout | 1–3 ms | Balbettio su schermi complessi |
| Draw | 2–8 ms | Ridisegno, caduta di fotogrammi |
| GPU Render | 3–10 ms | FPS dimezzati |
| GC (garbage collection) | 2–50 ms | Micro-balbettii percettibili all'occhio |
L'overdraw è il rendering ripetuto degli stessi pixel. Ogni livello di View, sfondo o immagine sotto un elemento trasparente aumenta il numero di operazioni pixel. Su Android, utilizza Debug GPU Overdraw nelle Opzioni sviluppatore; su iOS — Xcode Debug View Hierarchy. Riduci l'overdraw rimuovendo sfondi non necessari e utilizzando flag opachi: su Android — @drawable con android:opaque, su iOS — isOpaque = true per UIKit.View.
Le draw call sono il numero di comandi di rendering inviati alla GPU. Le GPU mobili moderne gestiscono 200–400 draw call per fotogramma a 60fps. Superare questo numero causa cali di prestazioni. Combina gli sprite in texture atlas, utilizza il batching ed evita il rendering individuale di ogni elemento tramite una draw call separata.
I freeze GC sono una delle cause principali di FPS instabili nelle applicazioni JVM e Kotlin. La garbage collection su Android può richiedere fino a 30–50 ms, causando la perdita di 2–3 fotogrammi consecutivi. Evita allocazioni nei cicli di animazione, utilizza pool di oggetti e pre-alloca memoria. Su iOS, il problema è meno critico grazie ad ARC, ma i cicli di ritenzione e gli overflow dell'autorelease pool creano anch'essi micro-balbettii.
Per i giochi, 60fps non è solo uno standard ma un vantaggio competitivo. Studi di Newzoo (2024) mostrano che i giochi con FPS instabili inferiori a 60 ricevono il 40% di recensioni negative in più su Google Play. Unity e Unreal Engine forniscono profiler integrati per monitorare il tempo di rendering: in Unity è Frame Debugger, in Unreal — GPU Visualizer, che mostrano il tempo esatto di ogni draw call e shader. I 60fps stabili sono particolarmente importanti per i giochi d'azione, dove ogni fotogramma perso può costare all'utente il completamento di un livello.
I display 90 Hz e 120 Hz stanno cambiando il livello di prestazioni target. Per le applicazioni che funzionano su dispositivi ProMotion, l'FPS target può essere 120 e il budget del fotogramma si riduce a 8,3 ms. Ciò richiede un codice due volte più efficiente, specialmente nelle draw call e nel rendering GPU.
Il vantaggio delle alte frequenze non è solo la fluidità: 120fps riduce il lag di input percepibile di 8–10 ms, fondamentale per i giochi e le applicazioni interattive. Tuttavia, la differenza tra 60 e 120fps richiede un approccio individuale: per le applicazioni UI (scorrimento, animazioni), 90fps può essere un compromesso ottimale tra fluidità e consumo energetico, poiché il rendering di 120 fotogrammi al secondo consuma il 30–40% di energia in più rispetto a 60.
Apple fornisce un'API per selezionare la frequenza preferita: preferredFramesPerSecond in CADisplayLink. Android prima dell'API 30 non offriva il controllo diretto sulla frequenza, ma a partire da Android 12, lo sviluppatore può impostare il RefreshRate tramite WindowManager, richiedendo 60, 90 o 120 Hz a seconda del tipo di contenuto.
Domande frequenti
30fps viene percepito come scatti durante lo scorrimento e le animazioni perché ogni fotogramma dura 33,3 ms e l'occhio nota la discretezza. 60fps fornisce un fotogramma ogni 16,7 ms — al di sotto della soglia di persistenza della visione per la maggior parte degli utenti.
Utilizza un profiler (Android Profiler, Xcode Instruments) e guarda l'istogramma del frame time. Se il 90%+ dei fotogrammi rientra in 16,7 ms senza picchi — gli FPS sono stabili. Picchi isolati fino a 30–50 ms creano un balbettio evidente.
Sì, ma richiede un'ottimizzazione aggressiva: bassa risoluzione di rendering, shader semplici, numero minimo di draw call, evitare trasparenze e ombre complesse. Testa su dispositivi di fascia bassa — mostreranno le prestazioni reali.
A causa del meccanismo di VSync: se la GPU non riesce a completare un fotogramma in 16,7 ms, perde il VBlank e mantiene il fotogramma corrente per altri 16,7 ms. Effettivamente, un fotogramma viene mostrato per due cicli di aggiornamento e gli FPS calano esattamente della metà.
Sì. Anche il semplice scorrimento di elenchi e le animazioni di transizione richiedono 60fps per un'esperienza confortevole. Gli utenti notano immediatamente i rallentamenti durante lo swipe e questo riduce la valutazione dell'applicazione di 2–3 volte nei test soggettivi.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche