Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 定时器不工作';开始_C#_Timer - Fatal编程技术网

C# 定时器不工作';开始

C# 定时器不工作';开始,c#,timer,C#,Timer,我用GDI做了一个游戏,我想做一个fps计数器。为此,我使用间隔为1000毫秒的System.Windows.Forms.Timer。在Form1_Paint()中,我增加fps变量,绘制一个显示fps的文本,并在末尾调用this.Invalidate()。在Timer\u Tick()中,我放置fps=0。在窗体1\u Load()中,我启用计时器并启动它。但是计时器没有启动,fps变量没有返回到0。为什么定时器不启动 我认为问题出在this.Invalidate(),我认为它不允许计时器调用

我用GDI做了一个游戏,我想做一个fps计数器。为此,我使用间隔为1000毫秒的
System.Windows.Forms.Timer
。在
Form1_Paint()
中,我增加
fps
变量,绘制一个显示fps的文本,并在末尾调用
this.Invalidate()
。在
Timer\u Tick()
中,我放置
fps=0
。在
窗体1\u Load()
中,我启用计时器并启动它。但是计时器没有启动,
fps
变量没有返回到0。为什么定时器不启动


我认为问题出在
this.Invalidate()
,我认为它不允许计时器调用
计时器。如果出现此问题,如何使计时器调用它?

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


您很可能正在寻找一个异步
计时器
,它在自己的线程上运行,如和。但是要注意跨线程调用。

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


您很可能正在寻找一个异步
计时器
,它在自己的线程上运行,如和。但是要注意跨线程调用。

首先,您需要确保计时器实际工作。我怀疑是这样,但您必须编写一些调试代码才能确定。一种方法是在表单上放置一个标签,并让计时器使用记号计数更新标签(即每次计时器触发时递增计数)。如果计时器正在工作,则该标签应每秒更新一次(大约)


对于FPS计数器,我建议与其让计时器更新UI,不如只计算FPS,让正常的游戏更新逻辑在需要时显示FPS。这样,您就不会在多个位置更新显示器,也不会浪费时间更新屏幕,只是为了显示FPS。

首先,您需要确保计时器实际工作。我怀疑是这样,但您必须编写一些调试代码才能确定。一种方法是在表单上放置一个标签,并让计时器使用记号计数更新标签(即每次计时器触发时递增计数)。如果计时器正在工作,则该标签应每秒更新一次(大约)


对于FPS计数器,我建议与其让计时器更新UI,不如只计算FPS,让正常的游戏更新逻辑在需要时显示FPS。这样,您就不会在多个位置更新显示,也不会浪费时间更新屏幕以显示FPS。

使用System.Diagnostics.Stopwatch来测量绘制之间的时间。 然后使用((双精度)1/Stopwatch.ElapsedMilliseconds)*1000计算帧速率。 从Elapsedmillesons中我们得到“每帧毫秒数”,倒数得到“每毫秒帧数”,最后乘以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";
    }

使用System.Diagnostics.Stopwatch测量喷漆间隔时间。 然后使用((双精度)1/Stopwatch.ElapsedMilliseconds)*1000计算帧速率。 从Elapsedmillesons中我们得到“每帧毫秒数”,倒数得到“每毫秒帧数”,最后乘以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";
    }

你能给我写一个使
fps=0
System.Timers.Timer
的例子吗?@Specter:如果你想访问一个控件,设置它应该足够了。谢谢它的帮助。你能给我写一个使
fps=0
System.Timers.Timer
的例子吗,请?@Specter:如果你想访问一个控件,设置它应该足够了。谢谢你的帮助