Skip to content

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. マーブルダイアグラム

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

各要素に、前回の値からのフレーム経過数が付加されます。最初の要素には購読開始からのフレーム経過数が付加されます。

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 を使用してください。