時間・フレーム制御(Time / Frame)オペレーター
概要
時間・フレーム制御オペレーターは、Observable シーケンスの要素を 時間やフレーム の観点から制御するオペレーター群です。スロットリング、ディレイ、タイムアウトなど、リアクティブプログラミングで頻出するタイミング制御を提供します。
R3 では多くのオペレーターに TimeSpan ベースと FrameProvider ベースの両方が用意されており、ゲームエンジン(Unity など)のフレーム単位の制御にも対応しています。
オペレーター一覧
スロットリング / デバウンス
| オペレーター | 説明 |
|---|---|
| Debounce | 値の発行後、指定時間内に新しい値が来なければその値を発行する |
| DebounceFrame | Debounce のフレームベース版 |
| ThrottleFirst | 最初の値を即座に発行し、その後一定期間の値を無視する |
| ThrottleFirstFrame | ThrottleFirst のフレームベース版 |
| ThrottleLast | 一定期間の最後の値を発行する(classic Rx の Sample に相当) |
| ThrottleLastFrame | ThrottleLast のフレームベース版 |
| ThrottleFirstLast | 最初の値を即座に発行し、期間終了時に最後の値も発行する |
| ThrottleFirstLastFrame | ThrottleFirstLast のフレームベース版 |
ディレイ
| オペレーター | 説明 |
|---|---|
| Delay | 各要素の発行を指定時間だけ遅延させる |
| DelayFrame | Delay のフレームベース版 |
| DelaySubscription | 購読自体を指定時間だけ遅延させる |
| DelaySubscriptionFrame | DelaySubscription のフレームベース版 |
タイムアウト
| オペレーター | 説明 |
|---|---|
| Timeout | 指定時間内に値が来なければ TimeoutException で完了する |
| TimeoutFrame | Timeout のフレームベース版 |
タイムスタンプ / インターバル
| オペレーター | 説明 |
|---|---|
| Timestamp | 各要素にタイムスタンプ(ticks)を付加する |
| TimeInterval | 各要素に前回からの経過時間(TimeSpan)を付加する |
| FrameCount | 各要素に現在のフレームカウントを付加する |
| FrameInterval | 各要素に前回からのフレーム経過数を付加する |
比較表
スロットリング系オペレーターの違い
| オペレーター | 発行タイミング | 発行する値 | 主なユースケース |
|---|---|---|---|
| Debounce | 値が落ち着いた後 | 最後の値 | テキスト入力のオートコンプリート |
| ThrottleFirst | 最初の値が来た直後 | 最初の値 | ボタンの連打防止 |
| ThrottleLast | 一定期間の終了時 | 最後の値 | 定期的なサンプリング |
| ThrottleFirstLast | 最初の値 + 期間終了時 | 最初と最後の値 | 即座の応答 + 最新値の保証 |
TimeSpan 版と Frame 版の違い
| 基準 | TimeSpan 版 | Frame 版 |
|---|---|---|
| 時間単位 | 実時間(ミリ秒・秒など) | フレーム数 |
| プロバイダー | TimeProvider | FrameProvider |
| 主な用途 | 一般的な .NET アプリケーション | Unity などのゲームエンジン |
| テスト | FakeTimeProvider で制御 | FakeFrameProvider で制御 |
使い分けガイド
「入力が落ち着いてから処理したい」→ Debounce
テキスト入力のオートコンプリートや検索候補の取得など、ユーザーの入力が止まるのを待ちたい場合に適しています。
「最初のクリックだけ受け付けたい」→ ThrottleFirst
ボタンの連打防止や、最初のイベントに即座に反応しつつ後続を無視したい場合に使います。
「定期的に最新値をサンプリングしたい」→ ThrottleLast
センサーデータの定期取得や UI の定期更新など、一定間隔で最新の値を取得したい場合に使います。
「即座の応答と最新値の両方が欲しい」→ ThrottleFirstLast
最初の値には即座に反応しつつ、期間中に最後に届いた値も漏らしたくない場合に使います。
「要素の発行を遅らせたい」→ Delay
アニメーションのタイミング調整や、意図的な遅延が必要な場合に使います。
「購読の開始を遅らせたい」→ DelaySubscription
ソースへの接続自体を遅延させたい場合(リトライ時のバックオフなど)に使います。
「応答がなければエラーにしたい」→ Timeout
ネットワークリクエストやセンサー値の監視で、一定時間応答がない場合にエラーとして扱いたい場合に使います。
「各値にタイミング情報を付けたい」→ Timestamp / TimeInterval
パフォーマンス計測やログ出力で、値の到着時刻や間隔を知りたい場合に使います。