Skip to content

ThrottleLastFrame

1. 概要

ThrottleLastFrame は、ThrottleLast のフレームベース版です。ソースシーケンスを指定フレーム数ごとにサンプリングし、各区間中に受け取った最後の値を下流に発行します。

Unity などのゲームエンジン環境で、フレーム単位の定期サンプリングを行いたい場合に使用します。

2. シグネチャ

フレーム数によるサンプリング

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

frameCount フレームごとにサンプリングし、各区間の最後の値を発行します。

csharp
source.ThrottleLastFrame(10)

フレーム数 + FrameProvider によるサンプリング

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

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

csharp
source.ThrottleLastFrame(10, fakeFrameProvider)

overload の使い分け

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

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

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

指定フレーム数ごとにサンプリングが行われ、各区間の最後の値が下流に発行されます。

4. サンプルコード

csharp
using R3;

// Unity で 10 フレームごとにプレイヤーの位置をサンプリング
playerPositionObservable
    .ThrottleLastFrame(10)
    .Subscribe(pos => SyncPosition(pos));

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

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

subject.OnNext(1);
subject.OnNext(2);
subject.OnNext(3);
fakeFrames.Advance(5);
// results: [3] — 区間中の最後の値が発行される

5. 補足

ThrottleLast との違い

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

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