在C#中,使用 Stopwatch 比较简单粗糙的替代 WIN32 下 C++ 中调用的 QueryPerformanceCounter

C# 中自带的那个 System.Windows.Form.Timer 看上去是通过消息事件方式的,精度上好像小于10ms 就不行了。因为我想每秒把界面刷新60次,结果,Timer.Interval=16后(为啥16?因为1000/60=16.66667),测了一下,真实的刷新只能跑到每秒40次左右。除非我把 Intervel=10或更小的值后,才会达到60帧左右。

于是找了半天网络,有的方式是引用 kernel32.dll 的库,然后就可以在 C# 中调用 QueryPerformanceCounter。感觉不是那么优雅。

最后居然发现这个 Sytem.Diagnostics.Stopwatch。真的像 一个计时器一样,按一下,开始【Stopwatch.Start()】,再按一下暂停【Stopwatch.Stop()】,再按一下又继续【Stopwatch.Start()】,另一个按钮按一下就重新开始【Stopwatch.Restart()】。

而且的,真的很准的,说是可精确到 1ms。这对我来说是够了,我看了一下 Stopwatch.Frequency,也就是 我这电脑支持的 每秒多少 ticks,是10000000。这个类还提供了一个 IsHighResolution,供你判断你的硬件系统是否支持高精度。我的本本支持。

这里贴一段代码简单说明:

static void test2()
{
	Stopwatch stopWatch = new Stopwatch();
	stopWatch.Restart();
	Thread.Sleep(1000);

	// Get the elapsed time as a TimeSpan value.

	TimeSpan ts = stopWatch.Elapsed;
	double m1 = stopWatch.ElapsedMilliseconds; //这里显示的时 Start() 或 Restart() 后开始的累计毫秒,Start()后若 Stop()了再 Start(),还是一样继续累计的。Restart() 才会重新开始累计。
	double m2 = ts.Milliseconds; //这只是当前毫秒值,不是累计值
	double m3 = ts.TotalMilliseconds; //这与 m1 一样
	double t = ts.Ticks; 
	// Format and display the TimeSpan value.
	string elapsedTime = String.Format("m1:{0}, m2:{1}, m3:{2}, ticks:{3}", m1, m2, m3, t);
	Console.WriteLine("RunTime " + elapsedTime);
	stopWatch.Restart();

	Thread.Sleep(3000);
	elapsedTime = String.Format("ElapsedMilliseconds: {0}", stopWatch.Elapsed.TotalMilliseconds);
	Console.WriteLine("RunTime " + elapsedTime);

	stopWatch.Stop();
}
posted @ 2024-12-22 21:31  PencilStart  阅读(5)  评论(0编辑  收藏  举报