DebounceFrame
1. 概要
DebounceFrame は、Debounce のフレームベース版です。ソースシーケンスから値を受け取るたびにフレームカウンターをリセットし、指定したフレーム数が経過しても新しい値が届かなかった場合にのみ、最後に受け取った値を下流に発行します。
Unity などのゲームエンジン環境で、フレーム単位のデバウンス処理を行いたい場合に使用します。
2. シグネチャ
フレーム数によるデバウンス
csharp
public static Observable<T> DebounceFrame<T>(
this Observable<T> source,
int frameCount)値を受け取るたびに frameCount フレームのカウンターを開始(リセット)し、カウンターが満了したら最後の値を発行します。デフォルトの FrameProvider が使用されます。
csharp
source.DebounceFrame(5)フレーム数 + FrameProvider によるデバウンス
csharp
public static Observable<T> DebounceFrame<T>(
this Observable<T> source,
int frameCount,
FrameProvider frameProvider)FrameProvider を指定してフレームカウントの実装を差し替えられます。テスト時に FakeFrameProvider を使用してフレームを手動制御できます。
csharp
source.DebounceFrame(5, fakeFrameProvider)overload の使い分け
| overload | 使う場面 |
|---|---|
int frameCount | Unity などでデフォルトのフレームプロバイダーを使う場合 |
int frameCount, FrameProvider | テスト時や独自のフレームプロバイダーを使いたい場合 |
3. マーブルダイアグラム
ソースが値を発行するたびにフレームカウンターがリセットされます。指定フレーム数の間に新しい値が届かなかった場合にのみ、最後の値が下流に発行されます。
4. サンプルコード
csharp
using R3;
// Unity でプレイヤー入力のデバウンス(5 フレーム)
playerInputObservable
.DebounceFrame(5)
.Subscribe(input => ExecuteAction(input));
// FakeFrameProvider を使ったテスト
var fakeFrames = new FakeFrameProvider();
var results = new List<int>();
Observable.Create<int>(observer =>
{
observer.OnNext(1);
observer.OnNext(2);
observer.OnNext(3);
return Disposable.Empty;
})
.DebounceFrame(3, fakeFrames)
.Subscribe(x => results.Add(x));
fakeFrames.Advance(3);
// results: [3] — 最後の値のみ発行される5. 補足
Debounce との違い
| 項目 | Debounce | DebounceFrame |
|---|---|---|
| 時間単位 | 実時間(TimeSpan) | フレーム数(int) |
| プロバイダー | TimeProvider | FrameProvider |
| 主な用途 | 一般的な .NET アプリケーション | Unity などのゲームエンジン |
動作の仕組みは Debounce と同一で、時間の計測単位がフレームに変わるだけです。