⏱️
Remotionコード分析 — Sequenceとタイムラインの時間管理の実装
SequenceContextでローカルタイムを実装する内部メカニズムとuseCurrentFrame()の動作原理
GitHub: remotion-dev/remotion/packages/core
Remotionの最も巧みな設計の1つはローカルタイムの概念です。<Sequence from={60}>内のコンポーネントはグローバルフレーム60を自分のフレーム0として認識します。
useCurrentFrame()はSequenceContext.fromをグローバルフレームから引くだけ。SequenceコンポーネントはabsoluteFromで親オフセットを累積し、isInRangeで自動マウント/アンマウント、SequenceContext.Providerでローカルタイムを伝播します。
SeriesはSequenceのfrom値をcurrentOffsetの累積で自動計算する便利ラッパーに過ぎません。
動作フロー
1
TimelineContextがグローバルframeを提供(レンダラーがwindow.remotion_setFrameで注入した値)
2
<Sequence from={60}>がSequenceContext.Providerでfrom=60を伝播
3
useCurrentFrame()がglobalFrame - sequenceContext.from = ローカルフレームを返却
4
ネストされたSequence: 親のfrom + 自身のfrom = absoluteFrom(累積)
5
isInRangeチェック: frameが範囲外ならnull返却 → 自動的にシーン登場/退場
メリット
- ✓ React Contextだけでタイムラインを実装: 追加ライブラリなしの純粋Reactパターン
- ✓ isInRange nullパターン: 範囲外のコンポーネントをレンダリングしないことでパフォーマンス最適化
デメリット
- ✗ Context乱用注意: ネストが深くなると再レンダリング範囲が広がる可能性
ユースケース
Sequenceベースのカスタムトランジション実装時のタイム計算の理解
ネストされたSequenceでフレーム計算が合わない時のデバッグ