Direct2D随笔2——在C#的WinForm环境下创建Gameloop
来源:互联网 发布:剃头理发器软件 编辑:程序博客网 时间:2024/05/22 06:12
经过大量前辈的实践证明,C#中Timer们的精度都无法达到60fps的需求。这一点可以做个实验,用2个Timer,一个1s,另一个0.01667s,然后后面timer的tick时给count+1,前面的每秒统计一下后面有几个+1,就会发现可能每秒只有大概30次左右。
关于比较好的计时系统google上面也有,就是利用这个性能计数器,计量的经度就能到很高了。
[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 PerformanceCounter);
为了把这个融入到Gameloop里面,我写了个类用来计时
public class PreciseTimer { [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 PerformanceCounter); long _tickPerSecond = 0; long _previousElapsedTime = 0; public PreciseTimer () { QueryPerformanceFrequency(ref _tickPerSecond); GetElapsedTime(); } public double GetElapsedTime () { long Time = 0; QueryPerformanceCounter(ref Time); double ElapsedTime = (double)(Time - _previousElapsedTime) / (double)_tickPerSecond; _previousElapsedTime = Time; return ElapsedTime; }}这样就可以得到一个相对准确的秒表( ╯□╰ )了。
然后,我们需要windows的消息处理机制,这里我们使用了C里面的Message。
[StructLayout(LayoutKind.Sequential)]public struct Message { public IntPtr hWnd; public Int32 Msg; public IntPtr wParam; public IntPtr lParam; public uint time; public System.Drawing.Point P;}并且我们需要C里面的PeekMessage函数。
[System.Security.SuppressUnmanagedCodeSecurity][DllImport("User32.dll", CharSet = CharSet.Auto)]public static extern bool PeekMessage ( out Message Msg, IntPtr hWnd, uint messageFilterMin, uint messageFilterMax, uint flags);然后利用这些东西,我们就拼凑出了一个类,起名叫做TimeController。
PreciseTimer _preciseTimer = new PreciseTimer(); public delegate void LoopCallBack (double ElapsedTime); LoopCallBack _loopCallBack; public TimeController (LoopCallBack CallBack) { _loopCallBack = CallBack; Application.Idle += new EventHandler(OnApplicationEnterIdle); } private void OnApplicationEnterIdle (object sender, EventArgs e) { while (IsAppStillIdle()) _loopCallBack(_preciseTimer.GetElapsedTime()); } private bool IsAppStillIdle () { Message Msg; return !PeekMessage(out Msg, IntPtr.Zero, 0, 0, 0); }然后我们只需要在Form1.cs里面添加一个Gameloop函数
void GameLoop (double ElapsedTime) {}最后定义出来timeController。
TimeController timeController;并且将Gameloop放进去
timeController = new TimeController(GameLoop);
就完成了。
这些东西在网上比较难找,所以特意记下来。
0 0
- Direct2D随笔2——在C#的WinForm环境下创建Gameloop
- Direct2D随笔1——构建D2D环境
- Direct2D随笔4——GameInput
- Direct2D随笔3——构建游戏基础结构
- 随笔10 - C# WinForm下的只带下边框的TextBox
- 在C# + Access + ADOX环境下创建数据库和数据表
- C# WinForm 下的分页
- [WINFORM] C#下的winform编程如何在窗体中实现超级链接
- [WINFORM] C#下的winform编程如何在窗体中实现超级链接
- 总结--创建简单的Direct2D应用程序
- Direct2D总结--创建简单的应用程序
- Direct2D中资源的创建顺序
- C#在WinForm下用摄像头
- 手工创建、部署EJB——在支持热部署的Jboss环境下
- 手工创建、部署EJB——在支持热部署的Jboss环境下
- C#入门12.1——创建Winform程序
- WIN32框架下的循环(Gameloop)与绘制(Render)
- 在C# WinForm程序中创建控件数组及相应的事件处理
- Android系统架构
- C语言编译原理
- 在WPF程序中使用摄像头兼谈如何使用AForge.NET控件
- How Many Tables 并查集+水题+hdu
- python 进阶学习之15
- Direct2D随笔2——在C#的WinForm环境下创建Gameloop
- POJ 2115 C Looooops
- hdu 1087 Super Jumping! Jumping! Jumping!(dp 最长上升子序列和)
- Django安装
- poj3422 来一道费用流
- Java对象的序列化和反序列化实践
- Windows Program Files 和 Program Files (x86) 的区别
- 小希的迷宫 并查集+hdu
- 使用json-lib完成json的序列化和反序列化