
SwiftやiOSアプリ開発で「高精度な時間測定」や「パフォーマンスのベンチマーク」を行いたい時に便利なのが CACurrentMediaTime() です。
通常の Date() や DispatchTime よりも高精度かつ一貫したタイミング取得が可能なため、アニメーションの制御や経過時間の測定などでよく使われます。
この記事では CACurrentMediaTime() の意味や使い方、主要なポイントや活用例までを、初心者にもわかりやすく丁寧に解説します。
CACurrentMediaTime() とは?
CACurrentMediaTime() は、Core Animation フレームワークに含まれる関数で、「アプリが起動してからの経過時間(秒単位)」を Double型 で返す関数です。
この関数は特に以下のような特徴があります:
- 秒単位(Double)で返ってくる
- 基準時刻は固定(通常はアプリの起動時)
- 非常に高精度(ナノ秒レベル)
- システム時刻の変更の影響を受けない
つまり、ユーザーのタイムゾーンや設定の影響を一切受けず、「純粋に経過時間を測定したいとき」に最適です。
基本的な使い方
例えば、ボタンを押したときに「ある処理が何秒かかったか」を計測して表示する例を見てみましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import SwiftUI struct ContentView: View { @State private var elapsedTime: Double? var body: some View { VStack(spacing: 20) { Button("処理を計測する") { // 計測開始 let startTime = CACurrentMediaTime() // --- ここに計測したい処理を書く --- var total = 0 for i in 0..<1_000_000 { total += i } print(total) // ダミー処理 // 計測終了 let elapsed = CACurrentMediaTime() - startTime elapsedTime = elapsed } if let elapsedTime { Text("処理にかかった時間: \(elapsedTime) 秒") .font(.headline) } } .padding() } } |
コードのポイント
let startTime = CACurrentMediaTime()
→ 計測開始時点の時刻を取得。- 計測したい処理(例:ループや計算)をその間に実行。
let elapsed = CACurrentMediaTime() - startTime
→ 処理終了時に再度時刻を取得し、差分で経過時間を算出。@State private var elapsedTime
→ 結果を保持して SwiftUI のビューに表示できるようにする。Text("処理にかかった時間...")
→ 計測結果をリアルタイムにUIに反映。
このように、ある処理の前後で CACurrentMediaTime() を呼ぶことで、簡単に処理時間を計測できます。

使用例:アニメーションの経過時間を測定する
アニメーションやゲームのように「時間の経過に応じて動きを更新する処理」では、前回のフレームからどれだけ時間が経ったのか(経過時間)を知ることが大切です。
そのために CACurrentMediaTime() を使うと、毎回のフレーム間の差分(delta)を計算できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var previousTime = CACurrentMediaTime() func updateFrame() { // 現在の時刻を取得 let currentTime = CACurrentMediaTime() // 前回からの経過時間(秒) let delta = currentTime - previousTime // 今回の時刻を次回の基準に更新 previousTime = currentTime print("前回からの経過時間: \(delta)") } |
上記のコードでは、updateFrame() が呼ばれるたびに「前回の呼び出しから何秒経ったか」が delta に記録されます。
この delta を使うと、以下のようなことが可能になります:
- フレームレートに依存しないアニメーション速度の制御
- 処理が重くてフレーム間隔が伸びても、時間に応じた補正が可能
- 一定間隔ごとの処理(スロットルやデバウンス)の実現
例えば、キャラクターを「1秒あたり100ピクセル動かしたい」場合、delta を掛け算すれば「今回のフレームで実際にどれだけ動かすべきか」を正しく求められます。
このようにCACurrentMediaTime()を使えば、環境やフレームレートに左右されない、なめらかで安定したアニメーション制御が可能になります。
引数は不要
CACurrentMediaTime() は引数を一切取らない関数です。
呼び出すだけで、現在の高精度な「メディア時間(media time)」を返します。
|
1 2 |
let now = CACurrentMediaTime() |
この戻り値は Double 型であり、「アプリ起動からの経過秒数」を表します。
- 型:
Double - 単位:秒(例:12345.678901秒)
- 精度:非常に高い(ナノ秒オーダーの精度)
なお、「メディア時間(Media Time)」とは Core Animation において時間を統一的に管理する概念で、アニメーションなどの時間管理に使われています。
活用シーン
CACurrentMediaTime() は単なる時間取得だけでなく、以下のような多様な場面で活用できます。
- 高精度なパフォーマンス計測(ベンチマーク)
- アニメーションの経過時間制御(特にCore Animation系)
- ゲームやリアルタイムアプリのタイミング管理
- スロットル処理やデバウンス処理における時間差の判定
通常の Date() や DispatchTime よりも精度が高く、OSの時計調整などにも左右されない点が大きな利点です。
注意点
便利な CACurrentMediaTime() ですが、使う上でいくつか注意点があります。
- 時刻そのもの(日付や時刻)ではなく「経過時間」である点に注意
- システムクロックに依存しないので、ログ出力などには不向き
- バックグラウンド遷移中は正確に時間が進んでいない可能性があるため、アプリ状態によって注意が必要
まとめ
今回は CACurrentMediaTime() について解説しました。
CACurrentMediaTime()はアプリ起動からの経過時間を秒単位で返す関数- 精度が非常に高く、パフォーマンス測定やアニメーション制御に適している
- 引数なしで簡単に使え、戻り値は
Double - 高精度な経過時間が必要な場面に最適
もしアプリ内で「この処理に何秒かかったか」を知りたい、「なめらかなアニメーションを手動で制御したい」という場合、ぜひ CACurrentMediaTime() の利用を検討してみてくださいね!
