C# 定时器不工作';开始
我用GDI做了一个游戏,我想做一个fps计数器。为此,我使用间隔为1000毫秒的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(),我认为它不允许计时器调用
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:如果你想访问一个控件,设置它应该足够了。谢谢你的帮助