【问题标题】:How to realize accurate time counter (millisecond precision)如何实现精确的时间计数器(毫秒精度)
【发布时间】:2015-01-10 18:30:54
【问题描述】:

对不起我的英语。

我在 Unity 上开发了一个客户端-服务器游戏,我需要在客户端和服务器上使用相等的时间计数器来进行同步。在服务器端(Java)一切正常。

在客户端上,我尝试将 Fixed Time-step 设置为 0.001 并在 FixedUpdate 上计算时间。它可以工作,但在与其他脚本的一个线程中,有时会滞后。我在article

中对此深信不疑

我也尝试在其他线程中计算时间,但是这段代码的时间错误(我尝试了 TICK_TIME 1 和 5)

while (started)
         {
             time += TICK_TIME;
             Thread.Sleep(TICK_TIME);
         }

如何实现稳定计数器?在 Unity 中是否可行?

【问题讨论】:

标签: c# multithreading timer unity3d


【解决方案1】:

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch%28v=vs.110%29.aspx

var watch = Stopwatch.StartNew();

//Do work

Console.WriteLine("Time elapsed: {0}", watch.ElapsedMilliseconds);

【讨论】:

  • 它工作得更准确,但是Thread.Sleep(1) 给出了 0 到 60% 的情况,1 到 30%,有时是 2 和 3。有什么办法可以让时间稳定吗?
  • 您要求的是实时机器/操作系统的行为。这不是它在常规操作系统上的工作方式。计算机上的所有进程共享处理器时间。当您调用 thread.sleep(1) 时,您基本上会告诉分配 cpu-time 的调度程序:“不要给我下一毫秒的 cpu-time”,因此当您机器上的下一个进程需要 2ms cpu-time 时,您最终会得到2ms 线程休眠。
  • @Piranha 好的,我了解 Thread.Sleep()。还有其他方法吗?不一定是 1 毫秒,只是客户端上的同一时间
  • @kimreik 你的具体问题是什么?秒表足够准确,但 Thread.Sleep 不够准确。测量时间不是问题。
  • @EmilePels 是的,秒表准确,谢谢。需要一个能够在不同客户端上提供稳定相同时间的代码。
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多