Skip to content

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 frameCountUnity などでデフォルトのフレームプロバイダーを使う場合
int frameCount, FrameProviderテスト時や独自のフレームプロバイダーを使いたい場合

3. マーブルダイアグラム

DebounceFrame のマーブルダイアグラム

ソースが値を発行するたびにフレームカウンターがリセットされます。指定フレーム数の間に新しい値が届かなかった場合にのみ、最後の値が下流に発行されます。

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 との違い

項目DebounceDebounceFrame
時間単位実時間(TimeSpanフレーム数(int
プロバイダーTimeProviderFrameProvider
主な用途一般的な .NET アプリケーションUnity などのゲームエンジン

動作の仕組みは Debounce と同一で、時間の計測単位がフレームに変わるだけです。