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 frameCount | Unity などでデフォルトのフレームプロバイダーを使う場合 |
int frameCount, FrameProvider | テスト時や独自のフレームプロバイダーを使いたい場合 |
3. マーブルダイアグラム
指定フレーム数ごとにサンプリングが行われ、各区間の最後の値が下流に発行されます。
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 との違い
| 項目 | ThrottleLast | ThrottleLastFrame |
|---|---|---|
| 時間単位 | 実時間(TimeSpan) | フレーム数(int) |
| プロバイダー | TimeProvider | FrameProvider |
| 主な用途 | 一般的な .NET アプリケーション | Unity などのゲームエンジン |
動作の仕組みは ThrottleLast と同一で、時間の計測単位がフレームに変わるだけです。