⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 highresolutiontimer.cs

📁 Beginning C# Game Programming 的源代码
💻 CS
字号:
using System;
using System.Runtime.InteropServices;

namespace SimpleSprite {
	/// <summary>
	/// Summary description for HighResolutionTimer.
	/// </summary>
	public class HighResolutionTimer {
		[System.Security.SuppressUnmanagedCodeSecurity]
		[DllImport("kernel32")]
		private static extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);

		[System.Security.SuppressUnmanagedCodeSecurity]
		[DllImport("kernel32")]
		private static extern bool QueryPerformanceCounter(ref long PerformanceCount);

		private bool timerInitialized = false;
		private bool usingQPF = false;
		private bool timerStopped = true;
		private long ticksPerSecond = 0;
		private long stopTime = 0;
		private long lastElapsedTime = 0;
		private long baseTime = 0; // Set when timer is started or reset
		private long timeNow = 0; 
		private double elapsedTime = 0.0;

		public HighResolutionTimer() { 
			timerInitialized = true;

			usingQPF = QueryPerformanceFrequency(ref ticksPerSecond);
			if (usingQPF)
				ticksPerSecond = ticksPerSecond;
			else
				throw new Exception("Timer init failure -- no QueryPerformanceCounter");
		}


		public void Reset() {
			QueryPerformanceCounter(ref timeNow);
			baseTime        = timeNow;
			lastElapsedTime = timeNow;
			stopTime        = 0;
			timerStopped     = false;
		}

		public void Start() {
			if (stopTime != 0)
				timeNow = stopTime;
			else
				QueryPerformanceCounter(ref timeNow);

			if (timerStopped)
				baseTime += timeNow - stopTime;
			stopTime = 0;
			lastElapsedTime = timeNow;
			timerStopped = false;
		}

		public void Stop() {
			QueryPerformanceCounter(ref timeNow);
			stopTime        = timeNow;
			lastElapsedTime = timeNow;
			timerStopped    = true;
		}

		public long Frequency{
			get { return ticksPerSecond; }
		}

		public void Advance() {
			stopTime += ticksPerSecond/10;
		}

		public float AbsoluteTime {
			get { 
				if (stopTime != 0)
					timeNow = stopTime;
				else
					QueryPerformanceCounter(ref timeNow);
				return (float) (timeNow / (double) ticksPerSecond);
			}
		}

		public float ApplicationTime {
			get {
				return TimeDelta(baseTime);
			}
		}

		public float ElapsedTime {
			get {
				return TimeDelta(lastElapsedTime);
			}
		}

		private float TimeDelta(float refTime) {
			QueryPerformanceCounter(ref timeNow);
			elapsedTime = (double) (timeNow - refTime) / (double) ticksPerSecond;
			lastElapsedTime = timeNow;
			return (float)elapsedTime;
		}

		public float PeekTime {
			get {
					long peek = 0;
					QueryPerformanceCounter(ref peek);
					return (float) (peek - lastElapsedTime) / (float) ticksPerSecond;
				}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -