Skip to content

時間・フレーム制御(Time / Frame)オペレーター

概要

時間・フレーム制御オペレーターは、Observable シーケンスの要素を 時間やフレーム の観点から制御するオペレーター群です。スロットリング、ディレイ、タイムアウトなど、リアクティブプログラミングで頻出するタイミング制御を提供します。

R3 では多くのオペレーターに TimeSpan ベースと FrameProvider ベースの両方が用意されており、ゲームエンジン(Unity など)のフレーム単位の制御にも対応しています。

オペレーター一覧

スロットリング / デバウンス

オペレーター説明
Debounce値の発行後、指定時間内に新しい値が来なければその値を発行する
DebounceFrameDebounce のフレームベース版
ThrottleFirst最初の値を即座に発行し、その後一定期間の値を無視する
ThrottleFirstFrameThrottleFirst のフレームベース版
ThrottleLast一定期間の最後の値を発行する(classic Rx の Sample に相当)
ThrottleLastFrameThrottleLast のフレームベース版
ThrottleFirstLast最初の値を即座に発行し、期間終了時に最後の値も発行する
ThrottleFirstLastFrameThrottleFirstLast のフレームベース版

ディレイ

オペレーター説明
Delay各要素の発行を指定時間だけ遅延させる
DelayFrameDelay のフレームベース版
DelaySubscription購読自体を指定時間だけ遅延させる
DelaySubscriptionFrameDelaySubscription のフレームベース版

タイムアウト

オペレーター説明
Timeout指定時間内に値が来なければ TimeoutException で完了する
TimeoutFrameTimeout のフレームベース版

タイムスタンプ / インターバル

オペレーター説明
Timestamp各要素にタイムスタンプ(ticks)を付加する
TimeInterval各要素に前回からの経過時間(TimeSpan)を付加する
FrameCount各要素に現在のフレームカウントを付加する
FrameInterval各要素に前回からのフレーム経過数を付加する

比較表

スロットリング系オペレーターの違い

オペレーター発行タイミング発行する値主なユースケース
Debounce値が落ち着いた後最後の値テキスト入力のオートコンプリート
ThrottleFirst最初の値が来た直後最初の値ボタンの連打防止
ThrottleLast一定期間の終了時最後の値定期的なサンプリング
ThrottleFirstLast最初の値 + 期間終了時最初と最後の値即座の応答 + 最新値の保証

TimeSpan 版と Frame 版の違い

基準TimeSpan 版Frame 版
時間単位実時間(ミリ秒・秒など)フレーム数
プロバイダーTimeProviderFrameProvider
主な用途一般的な .NET アプリケーションUnity などのゲームエンジン
テストFakeTimeProvider で制御FakeFrameProvider で制御

使い分けガイド

「入力が落ち着いてから処理したい」→ Debounce

テキスト入力のオートコンプリートや検索候補の取得など、ユーザーの入力が止まるのを待ちたい場合に適しています。

「最初のクリックだけ受け付けたい」→ ThrottleFirst

ボタンの連打防止や、最初のイベントに即座に反応しつつ後続を無視したい場合に使います。

「定期的に最新値をサンプリングしたい」→ ThrottleLast

センサーデータの定期取得や UI の定期更新など、一定間隔で最新の値を取得したい場合に使います。

「即座の応答と最新値の両方が欲しい」→ ThrottleFirstLast

最初の値には即座に反応しつつ、期間中に最後に届いた値も漏らしたくない場合に使います。

「要素の発行を遅らせたい」→ Delay

アニメーションのタイミング調整や、意図的な遅延が必要な場合に使います。

「購読の開始を遅らせたい」→ DelaySubscription

ソースへの接続自体を遅延させたい場合(リトライ時のバックオフなど)に使います。

「応答がなければエラーにしたい」→ Timeout

ネットワークリクエストやセンサー値の監視で、一定時間応答がない場合にエラーとして扱いたい場合に使います。

「各値にタイミング情報を付けたい」→ Timestamp / TimeInterval

パフォーマンス計測やログ出力で、値の到着時刻や間隔を知りたい場合に使います。