Skip to content

ThrottleFirstLastFrame

1. 概要

ThrottleFirstLastFrame は、ThrottleFirstLast のフレームベース版です。ソースシーケンスから最初に届いた値を即座に下流へ発行し、指定フレーム数の経過後に期間中の最後の値も発行します。

Unity などのゲームエンジン環境で、フレーム単位の ThrottleFirstLast 処理を行いたい場合に使用します。

2. シグネチャ

フレーム数によるスロットリング

csharp
public static Observable<T> ThrottleFirstLastFrame<T>(
    this Observable<T> source,
    int frameCount)

最初の値を即座に発行した後、frameCount フレーム経過時に期間中の最後の値を発行します。

csharp
source.ThrottleFirstLastFrame(10)

フレーム数 + FrameProvider によるスロットリング

csharp
public static Observable<T> ThrottleFirstLastFrame<T>(
    this Observable<T> source,
    int frameCount,
    FrameProvider frameProvider)

FrameProvider を指定してフレームカウントの実装を差し替えられます。

csharp
source.ThrottleFirstLastFrame(10, fakeFrameProvider)

overload の使い分け

overload使う場面
int frameCountUnity などでデフォルトのフレームプロバイダーを使う場合
int frameCount, FrameProviderテスト時や独自のフレームプロバイダーを使いたい場合

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

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

最初の値が即座に発行され、指定フレーム数の経過後に期間中の最後の値が追加で発行されます。

4. サンプルコード

csharp
using R3;

// Unity でタッチイベント:即座の応答と最終位置の両方を取得
touchObservable
    .ThrottleFirstLastFrame(15)
    .Subscribe(pos => HandleTouch(pos));

// FakeFrameProvider を使ったテスト
var fakeFrames = new FakeFrameProvider();
var results = new List<int>();

var subject = new Subject<int>();
subject
    .ThrottleFirstLastFrame(5, fakeFrames)
    .Subscribe(x => results.Add(x));

subject.OnNext(1);  // 即座に発行
subject.OnNext(2);
subject.OnNext(3);
// results: [1]

fakeFrames.Advance(5);
// results: [1, 3] — 期間終了時に最後の値も発行

5. 補足

ThrottleFirstLast との違い

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

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