【问题标题】:Precise timer with event similar to Timer.Tick具有类似于 Timer.Tick 事件的精确计时器
【发布时间】:2024-01-13 09:42:01
【问题描述】:

我正在为一个游戏做一个简单的高分插件。为此,我需要一个精确的计时器,可以在标签中显示经过的时间。到目前为止,我已经尝试了以下方法:

Windows.Forms.Timer:不保持高分辨率间隔,有些较慢,有些较快。

System.Diagnostics.Stopwatch:没有滴答事件。

我也想过实现一个低分辨率的 Forms.Timer。然后,当计时器启动和停止时,我会存储系统时间并减去它们以获得经过的时间。但我不想让事情过于复杂。有什么想法吗?

【问题讨论】:

  • 所以你想在标签中显示经过的刻度数?
  • 你到底想做什么——测量经过的时间还是间隔执行代码?
  • 一个事件永远不可能在时间上精确——它在消息循环中被处理,不能保证它何时发生。为什么事件需要精确?为什么秒表需要刻度事件?
  • @J...我想存储完成游戏所需的确切时间。我需要在标签中显示经过的时间
  • 计时器有足够的分辨率来分配标签的 Text 属性。当您以每秒 25 次以上的速度执行此操作时,它只会在人眼中变得模糊。您显示的实际 value 与该计时器没有任何关系。秒表很适合。

标签: c# timer


【解决方案1】:

我认为使用Stopwatch(因为它的高分辨率)和低分辨率Windows.Forms.Timer 的组合不会过于复杂。

Stopwatch 使用起来非常简单,因此它也不会增加使用 Timer 的复杂性。

(假设您可以使用高分辨率的经过时间显示,但使用较低分辨率的更新间隔。)

【讨论】:

  • 这也是个好主意。我可以同时启动秒表和计时器,然后将秒表的值写入标签每个 Tick...
  • ok 这似乎可行,虽然显示时间(在标签中)并不总是准确的,但我将存储在高分数据库中的值是......
【解决方案2】:

使用从某个时刻开始的经过时间。比任何一个:

  • 选择任何计时器,将其设置为 15 毫秒,并在每次滴答时显示经过的时间(如果您正在处理 WinForm/WPF 控件,应该可以)
  • 在每次帧刷新时显示新值(如果您的代码在每次帧刷新时得到通知/调用)

【讨论】:

    【解决方案3】:

    如果你愿意接受依赖,你可以使用Reactive Extensions (Rx) 来获取计时器:

    var timer = Observable.Interval(TimeSpan.FromMilliseconds(15))
                .Subscribe(() => /* handler */ );
    

    Rx 将确保在创建订阅的同一线程上调用处理程序,并且在后台它使用 System.Threading.Timer,因此它具有相当高且一致的分辨率。

    【讨论】:

      最近更新 更多