FrameInterval
1. 概要
FrameInterval は、ソースシーケンスの各要素に、前回の値(または購読開始)からのフレーム経過数を付加するオペレーターです。各要素は (long FrameInterval, T Value) のタプルとして発行されます。
Unity などのゲームエンジン環境で、値の到着間隔をフレーム単位で計測したい場合に使用します。
2. シグネチャ
デフォルト FrameProvider によるフレーム間隔付加
csharp
public static Observable<ValueTuple<long, T>> FrameInterval<T>(
this Observable<T> source)デフォルトの FrameProvider を使用して、各要素に前回からのフレーム経過数を付加します。
csharp
source.FrameInterval()FrameProvider 指定によるフレーム間隔付加
csharp
public static Observable<ValueTuple<long, T>> FrameInterval<T>(
this Observable<T> source,
FrameProvider frameProvider)指定した FrameProvider を使用してフレーム間隔を計測します。テスト時に FakeFrameProvider を使用可能です。
csharp
source.FrameInterval(fakeFrameProvider)overload の使い分け
| overload | 使う場面 |
|---|---|
| 引数なし | Unity などでデフォルトのフレームプロバイダーを使う場合 |
FrameProvider | テスト時や独自のフレームプロバイダーを使いたい場合 |
3. マーブルダイアグラム
各要素に、前回の値からのフレーム経過数が付加されます。最初の要素には購読開始からのフレーム経過数が付加されます。
4. サンプルコード
csharp
using R3;
// 入力イベントのフレーム間隔を計測
inputObservable
.FrameInterval()
.Subscribe(item =>
{
var (interval, value) = item;
Console.WriteLine($"前回から {interval} フレーム経過: {value}");
});
// フレーム間隔が大きすぎる(処理落ち)場合に警告
updateObservable
.FrameInterval()
.Where(item => item.Item1 > 3)
.Subscribe(item =>
{
Console.WriteLine($"警告: {item.Item1} フレーム間隔が開きました");
});
// FakeFrameProvider を使ったテスト
var fakeFrames = new FakeFrameProvider();
var results = new List<(long, int)>();
var subject = new Subject<int>();
subject
.FrameInterval(fakeFrames)
.Subscribe(item => results.Add(item));
fakeFrames.Advance(10);
subject.OnNext(1);
// results: [(10, 1)] — 購読開始から 10 フレーム
fakeFrames.Advance(3);
subject.OnNext(2);
// results: [(10, 1), (3, 2)] — 前回から 3 フレーム5. 補足
FrameCount / TimeInterval との違い
| オペレーター | 付加する値 | 型 | 基準 |
|---|---|---|---|
| FrameCount | 到着フレーム番号(絶対値) | (long, T) | フレーム(絶対) |
| FrameInterval | 前回からのフレーム経過数(相対値) | (long, T) | フレーム(相対) |
| TimeInterval | 前回からの経過時間 | (TimeSpan, T) | 実時間(相対) |
FrameInterval はフレーム単位の相対間隔、FrameCount はフレーム単位の絶対位置です。実時間での間隔計測には TimeInterval を使用してください。