Timestamp ReactiveX视频游戏渲染循环计时

Timestamp ReactiveX视频游戏渲染循环计时,timestamp,event-loop,reactivex,rx.net,Timestamp,Event Loop,Reactivex,Rx.net,我目前正在研究.net中的reactivex,以用于模拟重游戏。我的第一个目标是创建基本的事件/渲染循环。我有以下代码,几乎完全符合我的要求 var frames = Observable .Interval(TimeSpan.Zero, new EventLoopScheduler()) .Timestamp() .Select(timestamp => new Frame { Count = timestamp.Value,

我目前正在研究.net中的reactivex,以用于模拟重游戏。我的第一个目标是创建基本的事件/渲染循环。我有以下代码,几乎完全符合我的要求

var frames = Observable
    .Interval(TimeSpan.Zero, new EventLoopScheduler())
    .Timestamp()
    .Select(timestamp => new Frame
    {
        Count = timestamp.Value,
        Timestamp = timestamp.Timestamp.ToUnixTimeMilliseconds()
    });

frames.Subscribe(frame =>
{
    Console.WriteLine($"GameObject 1 - frame.Count: {frame.Count} frame.Timestamp: {frame.Timestamp}");
});

frames.Subscribe(frame =>
{
    Console.WriteLine($"GameObject 2 - frame.Count: {frame.Count} frame.Timestamp: {frame.Timestamp}");
});

frames.ToTask().Wait();
这将在主线程上尽可能快地发出帧事件。完美的但是,我注意到,对于同一帧,两个订阅者之间的时间戳可能会稍微偏移。比如说,

GameObject 1 - frame.Count: 772 frame.Timestamp: 1519215592309
GameObject 2 - frame.Count: 772 frame.Timestamp: 1519215592310
同一帧的时间戳间隔为一毫秒。为了使这两个游戏对象/订阅者都能工作,他们需要在每一帧中获得完全相同的时间戳,否则模拟可能无法正常运行


我猜对于流中发出的每个事件,每个订阅者都会对Timestamp操作符求值一次。是否有一种方法可以让它对每个发出的事件对所有订阅者进行一次评估?谢谢

Whelp,我应该多给它几分钟的文档阅读时间

解决方案是使帧事件流可连接。我所要做的就是在订阅服务器连接到帧事件流之前发布它。然后在事件循环开始之前调用Connect。完美的该死的Rx太棒了

var frames = Observable
    .Interval(TimeSpan.Zero, new EventLoopScheduler())
    .Timestamp()
    .Select(timestamp => new Frame
    {
        Count = timestamp.Value,
        Timestamp = timestamp.Timestamp.ToUnixTimeMilliseconds()
    })
    .Publish();

frames.Subscribe(frame =>
{
    Console.WriteLine($"GameObject 1 - frame.Count: {frame.Count} frame.Timestamp: {frame.Timestamp}");
});

frames.Subscribe(frame =>
{
    Console.WriteLine($"GameObject 2 - frame.Count: {frame.Count} frame.Timestamp: {frame.Timestamp}");
});

frames.Connect();

frames.ToTask().Wait();