#events #synchronization #occurs #tick #fixed #setup #tickrate

event_sync

一个可以用来在固定时间间隔同步事件的 crate

15 个不稳定版本 (3 个重大更改)

0.4.4 2024年2月18日
0.4.2 2023年12月7日
0.4.0 2023年11月29日
0.1.1 2023年5月24日

#2 in #occurs

Download history 71/week @ 2024-03-29 17/week @ 2024-04-05

每月下载量 121

MIT 许可证

48KB
530

Event Sync

EventSync 是一个 crate,可以用来在固定时间间隔同步事件。

比如说,你希望一个事件每10毫秒发生一次,但设置这个事件需要几毫秒。你最终可能需要等待10毫秒加上设置事件所需的时间。

这就是 EventSync 发挥作用的地方。你可以创建一个 10ms 的 EventSync,设置你的事件,然后等待下一个滴答声。只要设置事件所需的时间小于 10ms,等待下一个滴答声将确保自上次事件以来恰好过去了 10ms。这看起来可能像这样

use event_sync::*;

let tickrate = 10; // 10ms between every tick.
let event_sync = EventSync::new(tickrate);

// multi-ms long task

event_sync.wait_for_tick();
// repeat the task

入门指南

为了使用 event_sync,你首先使用 EventSync::new() 创建一个 EventSync 实例。然后传入 EventSync 期望的滴答频率,以便知道滴答的持续时间。(有关创建 EventSync 的更多方法,请参阅示例)

滴答频率将是一个以毫秒表示的整数,不能低于 1。如果你传入 0,则将设置为 1 毫秒。

use event_sync::*;

let tickrate = 10; // 10ms between every tick

// Create an event synchronizer with a 10ms tickrate.
let event_sync = EventSync::new(tickrate);

有了这个,你可以调用诸如 wait_for_x_ticks 等方法。这将等待传入的滴答次数。

这看起来可能像这样

use event_sync::*;

let tickrate = 10;
let event_sync = EventSync::new(tickrate);

// multi-ms long task.

// wait for the next 2 ticks
event_sync.wait_for_x_ticks(2);
// repeat the task

这将使得相关任务每20ms运行一次。

什么是 Tick

可以将 Tick 视为从 EventSync 创建开始的时间上的想象中的标记,以 Tickrate 的持续时间为间隔。

当你等待 1 滴答时,EventSync 将休眠其当前线程,直到下一个滴答。如果你等待多个滴答,EventSync 将休眠直到下一个滴答,再加上等待的剩余滴答的时间。

另一种描述方式。假设我们有 10ms 的滴答频率,并且自上次滴答以来已经过去了 5ms。如果你等待 1 滴答,EventSync 将休眠 5ms,这是到下一个滴答标记的持续时间。

权限

EventSync 可以存在于两种状态,即 MutableImmutable。这些状态表示可以在 EventSync 实例上调用哪些方法。

这些存在的原因是因为EventSync的关联性。必须涉及到某种层次结构,这样就不是任何人都可以改变世界。

如果您有一个包含EventSync的主结构,这将包含可变副本

use event_sync::*;

struct MasterTimeKeeper {
  synchronizer: EventSync<Mutable>,
}

如果您想将此传递给任何其他需要同步的线程,您会想传递这个主同步器的不可变副本

use event_sync::*;

struct MasterTimeKeeper {
  synchronizer: EventSync<Mutable>,
}

let tickrate = 10;
let who = MasterTimeKeeper { synchronizer: EventSync::new(tickrate) };

let connected_who: EventSync<Immutable> = who.synchronizer.clone_immutable();

// Pass the connected EventSync anywhere it's needed.

依赖项

~0.4-1MB
~24K SLoC