Direct2D随笔2——在C#的WinForm环境下创建Gameloop

在C#的WinForm环境中,使用内置Timer无法满足高精度的60fps游戏循环需求。实验表明,Timer的精度限制导致每秒只能执行约30次。为解决这一问题,可以利用性能计数器来实现更高精度的计时系统,从而实现更精确的Gameloop。此方法在网络上的资料较少,因此记录下来供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过大量前辈的实践证明,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 Per
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值