如何在WPF游戏中获取当前时间?(无需XNA)

7
我正在尝试制作一个类似游戏的应用程序,需要一段准确的时间来评估游戏互动。我看到一些使用名为“System.nanoTime”的方法的Java版本。请问是否有.NET版本?
更重要的是,我正在寻找一种定时器,可以用来评估世界。我应该使用实际的计时器控件并订阅它吗?此外,游戏在与UI线程不同的线程上运行,这会有影响吗?
6个回答

5
DateTime.Now在纳秒范围内没有实际分辨率。Tick是时间的100纳秒“块”,但DateTime.Now并不会每个Tick都解析。我相信DateTime.Now最低的分辨率是10毫秒左右。如果您很快地连续调用DateTime.Now两次,您将得到相同的答案。只有在大约10毫秒左右后,您才会看到它向上跳动,具体取决于您何时调用它。 Stopwatch类DateTime.Now有更好的分辨率。我相信它可以分辨到毫秒级别,这应该足够让您确定您的游戏评估代码是否表现良好。提供了一个很好的示例来对比Stopwatch和DateTime的区别。
此外,Frequency字段和GetTimestamp方法可用于替代未经处理的Win32 API QueryPerformanceFrequency和QueryPerformanceCounter。

秒表类将在底层实际使用QueryPerformanceCounter,如果它可用(请参见IsHighResolution字段)。因此,通常不需要手动使用Frequency字段和GetTimestamp方法。 - ollb
@Gnafoo - 那就是我想传达的。这条消息的意图是,您不需要(看不到好处)在kernal32.dll上使用P/Invoke。感谢您明确的表述。 - Dave White
@Joan Venge - 你需要开始标记问题已回答,否则人们将停止回答。我认为现在有几个问题还未解决。 - Dave White
@Dave:我经常回去标记它们,但这取决于哪种方法给我想要的结果。我只是不想在使用不同的方法时接受某些东西。对于那些在SO上找到这些问题并遇到相同问题的人来说,这并不有益。 - Joan Venge
举个例子,比如说我现在正在使用System.Threading.Timer,而不是DateTime.Now,因为它更接近我需要的东西,它让我可以在特定的时间间隔内调用一个方法,就像我问题中指定的那样。 - Joan Venge
@Joan 好的,但是为了关闭问题,鼓励提供一些反馈。例如,在Boo的答案上,添加一个评论,让他知道你正在尝试System.Threading.Timer,或者在我的答案上让我知道我没有回答你的问题。根据答案,似乎我们都以同一种方式思考你的问题,而你的意思可能不同。 - Dave White

4

System.Threading.Timer的分辨率为1毫秒。如果您需要更高的分辨率,可以使用kernel32.dll中的QueryPerformanceFrequency()和QueryPerformanceCounter()进行p/invoke调用。


3
你试过了吗?
DateTime.Now;

这段代码会在每次调用时返回当前时间。你可以在两个不同的时间点获取时间并通过endtime - startime计算时间跨度。

1
使用StopWatch类,它在内部使用QueryPerformanceCounter,因此您可以获得非常精细的分辨率。这样,您就不需要进行pinvoke/interop操作。

1

嗯,有DateTime.UtcNowDateTime.Now。然而,对于重复的进程,你应该使用其中一个计时器类。通常用于wpf的是DispatcherTimer


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接