计时器无法启动

时间:2011-02-16 16:03:44

标签: c# timer

我在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()。如果出现问题,如何让定时器调用呢?

3 个答案:

答案 0 :(得分:2)

System.Windows.Forms.Timer是同步计时器。它运行在与GUI相同的线程上,这意味着如果GUI忙于一些繁重的逻辑/计算,Timer将无法运行。

您最有可能寻找异步Timer,它在自己的线程上运行,如System.Timers.TimerSystem.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。