60fpsとは毎秒60フレームのフレームレートであり、各フレームは正確に16.7ミリ秒かかり、視覚的に滑らかな動きを実現します。Android Game Optimization Guideによると、安定した60 FPSはモバイルアプリケーションにおける快適なアニメーションの最小標準と見なされています。16.7ミリ秒は、開発者が60 FPSを達成するために1フレームのレンダリングに充てることのできる時間予算です。
重要なポイント
60fps(毎秒60フレーム、frames per second)は、ディスプレイが1秒間に60回画像を更新するフレームレートの指標です。人間の目は、視覚の残像効果により約50~60Hzで個別のフレームを識別できなくなり、60fpsはほとんどのユーザーにとって自然な滑らかさの閾値となります。
60fpsの各フレームには固定の時間予算16.67ミリ秒があります。この予算には、ユーザー入力の処理からレンダリング、画面出力までのすべてが含まれます。物理演算、アニメーション、複雑なシーンのレンダリングなど、いずれかの処理がこの制限を超えると、フレームレートは30fps以下に低下し、視覚的にスタッターとして知覚されます。
モバイル開発において、60fpsはハードウェアの制約により長い間上限とされてきました。2017年以前のほとんどのディスプレイは60Hzで動作していました。90Hzや120Hzの画面の登場により、60fpsは上限目標ではなく下限標準となりました。しかし、UIアプリケーション、ビデオ、ほとんどのカジュアルゲームでは、60fpsは依然としてパフォーマンスの目標指標であり続けています。
60Hzは米国と日本の電力網における交流電流の周波数であり、これが歴史的に最初のNTSCテレビ標準のリフレッシュレートを決定づけました。PAL標準は欧州の50Hz電力網に合わせて50Hzを使用していました。この歴史的な慣性がコンピューターモニター、そして後にモバイルディスプレイへと引き継がれました。
残像効果とは、刺激が消えた後も約30~50ミリ秒にわたって網膜に画像を保持する人間の視覚の特性です。60fpsでは、前のフレームの残像が消える前に16.7ミリ秒ごとに新しいフレームが届き、連続した動きの錯覚を生み出します。カーディフ大学(2023年)の研究によると、戦闘機パイロットは220Hzで個別のフレームを識別できますが、一般ユーザーにとって60Hzと120Hzの差は30Hzと60Hzの差ほど顕著ではありません。
Appleは2007年に初代iPhoneでiOSの標準として60fpsを設定し、iPhone 13 Pro(2021年)までそれを維持しました。Androidも歴史的に同じ標準に従っていましたが、90Hz(OnePlus 7 Pro、2019年)や120Hz(Razer Phone、2017年)を搭載した最初のデバイスはより早く登場しました。現在、60fpsはアニメーションを伴うアプリケーションがApp StoreやGoogle Playのレビューを通過するための最小閾値ですが、正式な要件として文書化されてはいません。
FPSの測定は最適化の第一歩です。客観的な指標なしに、パフォーマンスがどこで低下しているかを特定することは不可能です。モバイルプラットフォームは、リアルタイムでフレームレートを測定するための組み込みプロファイリングツールとソフトウェアAPIを提供しています。
Android Studio ProfilerとXcode InstrumentsはFPS分析のための主要ツールです。Android ProfilerはGPUレンダリング時間、フレームレート、Jank(ドロップされたフレーム数)を表示します。Xcode InstrumentsにはCore Animationテンプレートが含まれており、フレームレート、レンダリング時間、draw call数を表示します。ゲームエンジンでは、Unity ProfilerやUnreal Insightsがモジュールごとの詳細な時間内訳を提供します。
// Android — FrameMetricsによるFPS測定
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())
)
iOSのCADisplayLinkとAndroidのChoreographerは、ディスプレイのリフレッシュレートにレンダリングを同期するシステムメカニズムです。CADisplayLinkは新しいフレームごとにメソッドを呼び出し、遅延計算用のタイムスタンプを渡します。AndroidのChoreographerも同様の動作をしますが、入力、アニメーション、トラバーサル、レンダリングといった異なるフレームフェーズのコールバックをサポートしています。開発者はChoreographer.FrameCallbackに登録し、フレーム間の時間を測定できます。
安定した60fpsとは、どのフレームも16.7ミリ秒の予算を超えないことを意味します。1秒間に1つの長いフレームがあっても、目立つスタッターが発生します。最適化はCPU、GPU、メモリの3つのレベルに分けられます。それぞれがボトルネックになり得ます。
レイアウトパスは、AndroidとiOSにおけるCPU時間の主要な消費要因の1つです。複雑なView階層、ネストされたConstraintLayout、重いdrawableは、長いmeasureレイアウトチェーンを生み出します。UIアプリケーションでは、フラットなView階層(深さ3~4レベル以内)を使用し、ネストされたRecyclerViewはConcatAdapterに置き換え、iOSのリストではプリフェッチ付きのCompositional Layoutを使用してください。
| 操作 | 標準時間 | 超過時の影響 |
|---|---|---|
| レイアウト | 1~3ミリ秒 | 複雑な画面でのスタッター |
| 描画 | 2~8ミリ秒 | 再描画、フレームドロップ |
| GPUレンダリング | 3~10ミリ秒 | FPSが半分に低下 |
| GC(ガベージコレクション) | 2~50ミリ秒 | 目に見えるマイクロスタッター |
オーバードローとは、同じピクセルが繰り返しレンダリングされることです。Viewの各レイヤー、背景、透明要素の下の画像は、ピクセル操作の数を増加させます。AndroidではDeveloper OptionsのDebug GPU Overdrawを、iOSではXcode Debug View Hierarchyを使用してください。不要な背景を削除し、不透明フラグを使用してオーバードローを減らします。Androidではandroid:opaque付きの@drawable、iOSではUIKit.ViewのisOpaque = trueを使用します。
ドローコールはGPUに送信されるレンダリングコマンドの数です。最新のモバイルGPUは60fpsで1フレームあたり200~400のドローコールを処理します。この数を超えるとパフォーマンスが低下します。スプライトをテクスチャアトラスに結合し、バッチ処理を使用し、個別のドローコールによる各要素の個別レンダリングを避けてください。
GCフリーズは、JVMおよびKotlinアプリケーションにおける不安定なFPSの主な原因の1つです。Androidでのガベージコレクションには最大30~50ミリ秒かかることがあり、2~3フレーム連続でスキップされます。アニメーションループでのアロケーションを避け、オブジェクトプールを使用し、メモリを事前割り当てしてください。iOSではARCにより問題はそれほど深刻ではありませんが、 retain cycleやautorelease poolのオーバーフローもマイクロスタッターを引き起こします。
ゲームにとって、60fpsは単なる標準ではなく、競争上の優位性です。Newzoo(2024年)の調査によると、60fps未満の不安定なFPSのゲームはGoogle Playで40%多くネガティブなレビューを受けます。UnityとUnreal Engineはレンダリング時間を監視する組み込みプロファイラを提供しています。UnityではFrame Debugger、UnrealではGPU Visualizerが各ドローコールとシェーダーの正確な時間を表示します。安定した60fpsはアクションゲームで特に重要であり、フレームがドロップされるたびにユーザーがレベルをクリアできなくなる可能性があります。
90Hzや120Hzのディスプレイは、目標パフォーマンスの基準を変えています。ProMotionデバイスで動作するアプリケーションでは、目標FPSが120になり、フレーム予算は8.3ミリ秒に短縮されます。これには、特にドローコールとGPUレンダリングにおいて、2倍効率的なコードが必要です。
高リフレッシュレートの利点は滑らかさだけではありません。120fpsは知覚可能な入力遅延を8~10ミリ秒削減し、これはゲームやインタラクティブアプリケーションにとって重要です。ただし、60fpsと120fpsの違いには個別のアプローチが必要です。UIアプリケーション(スクロール、アニメーション)では、90fpsが滑らかさと消費電力の最適な妥協点となり得ます。120フレーム/秒のレンダリングは60フレーム/秒と比較して30~40%多くの電力を消費するためです。
Appleは好みのフレームレートを選択するためのAPIを提供しています:CADisplayLinkのpreferredFramesPerSecond。AndroidはAPI 30まではリフレッシュレートを直接制御できませんでしたが、Android 12以降、開発者はWindowManagerを介してRefreshRateを設定し、コンテンツの種類に応じて60、90、120Hzを要求できます。
よくある質問
30fpsでは各フレームが33.3ミリ秒持続するため、スクロールやアニメーション中にカクツキとして認識され、目が離散性を捉えてしまいます。60fpsは16.7ミリ秒ごとにフレームを提供するため、ほとんどのユーザーにとって残像の閾値を下回ります。
プロファイラ(Android Profiler、Xcode Instruments)を使用し、フレームタイムのヒストグラムを確認します。90%以上のフレームがスパイクなしに16.7ミリ秒以内に収まっていれば、FPSは安定しています。30~50ミリ秒までの孤立したスパイクは、目立つスタッターを引き起こします。
はい、ただし積極的な最適化が必要です。低レンダリング解像度、シンプルなシェーダー、最小限のドローコール、透明度や複雑な影の回避などが該当します。ローエンドデバイスでテストすれば、実際のパフォーマンスがわかります。
VSyncメカニズムのためです。GPUが16.7ミリ秒以内にフレームを完了できない場合、VBlankを見逃して現在のフレームをさらに16.7ミリ秒保持します。実質的に1つのフレームが2回のリフレッシュサイクルで表示され、FPSは正確に半分になります。
はい。シンプルなリストスクロールやトランジションアニメーションでも、快適な操作性には60fpsが必要です。ユーザーはスワイプ時の引っ掛かりを瞬時に認識し、主観テストではアプリの評価が2~3倍低下します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。