我在GDI做了一个游戏,我想制作一个fps计数器。为此,我使用System.Windows.Forms.Timer
,间隔为1000毫秒。在Form1_Paint()
我增加fps
变量时,我绘制了一个显示fps的文本,并在结尾调用this.Invalidate()
。在Timer_Tick()
我放fps = 0
。在Form1_Load()
我启用计时器并启动它。但是计时器没有启动,fps
变量也没有回到0.为什么计时器没有启动?
我认为问题来自this.Invalidate()
,我认为它不会让计时器调用Timer_Tick()
。如果出现问题,如何让定时器调用呢?
答案 0 :(得分:2)
System.Windows.Forms.Timer
是同步计时器。它运行在与GUI相同的线程上,这意味着如果GUI忙于一些繁重的逻辑/计算,Timer
将无法运行。
您最有可能寻找异步Timer
,它在自己的线程上运行,如System.Timers.Timer
和System.Threading.Timer
。但请注意跨线程调用。
答案 1 :(得分:1)
使用System.Diagnostics.Stopwatch测量涂料之间的时间。 然后用((double)1 / Stopwatch.ElapsedMilliseconds)* 1000计算帧速率。 从ElapsedMilliseconds我们得到“每帧毫秒”,反转数字给我们“每毫秒帧数”,最后乘以1000我们得到每秒所追求的帧数。
private void Form1_Paint(object sender, PaintEventArgs e)
{
long msec = watch.ElapsedMilliseconds;
watch.Reset();
watch.Start();
label1.Text = ((1d / msec) * 1000).ToString("F") + " FPS";
}
答案 2 :(得分:0)
首先,您需要确保计时器实际正常工作。我怀疑它是,但你必须写一些调试代码,以确定。一种方法是在表单上放置一个标签,让计时器用刻度计数更新标签(即每次计时器触发时计数增加)。如果计时器正在运行,那么该标签应该每秒更新一次(大约)。
对于你的FPS计数器,我建议不要让计时器更新UI,而应该只计算FPS并让普通游戏更新逻辑在你需要时显示FPS。这样你就不会在多个地方更新显示,而且你不会浪费时间更新屏幕只是为了显示FPS。