我目前正在努力完善我的应用程序并提高它的性能。基本上,这是一个高级的图形类。它画了几条线,然后刷新它们。
在修正了几个慢点后,我想对我的结果进行基准测试。我的画被困在了65 FPS (这是完美的,但我在基准)。我在计时器(设置为1ms)中使我的对象失效,并使用受保护的重写无效OnPaint -“方法”重新绘制我的东西。
在此之后,我将失效()放入受保护的覆盖无效OnPaint中。在此之后,FPS被设为几千家。但是使用这种方法会导致屏幕空。
我的问题是:这个问题是否故意的?这将是合理的,因为任何高于您的屏幕刷新是浪费权力。但我想禁用这个“锁”作为我的基准。
样本代码:
//Timer to refresh
private void timer1_Tick(object sender, EventArgs e)
{
Invalidate();
}
private DateTime date = DateTime.UtcNow;
private long times = 0;
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//Drawing
e.Graphics.DrawLine(new Pen(Brushes.Black), 50, 50, Width - 100, Height - 100);
//Required to tell me the framerate
if ((DateTime.UtcNow - date).Seconds > 1)
{
date = DateTime.UtcNow;
Debug.WriteLine(times);
times = 0;
}
times++;
}谢谢
~史蒂夫
发布于 2013-08-10 14:27:29
我的画被粘在了65 FPS
是的,这很正常。您正在测量操作系统的时钟中断率。它在大多数Windows机器上每秒滴答64次。计时器不能运行得更快,间隔属性的最小有用值为15。将其设置为1没有任何影响,它仍然每15.625毫秒只运行一次。
您实际上可以提高中断率,并使定时器的分辨率更好。您将不得不调用timeBeginPeriod()。这是多么的毫无意义,人类无法观察到这种差异。然而,你的笔记本电脑上的电池会消耗得更快。
这里最明智的做法是使用实用的更新率。人类的眼睛每秒上升到大约20帧,之后就变成了模糊。或者看上去很流畅,这取决于您正在做的更新类型。一些在电影院里被利用的东西,它以24 fps的速度更新。因此,实际的间隔属性值略低于预期时钟中断率的倍数。它们是2x 15.625 = 31毫秒或32 fps。和3x 15.625 = 46毫秒或21 fps。你不想随意地让这些数字变小,如果你这样做的话,你的程序在不同的机器上就不会有一致的更新速度。
您只需要优化您的代码,如果您的绘画代码无法跟上这一速度。实际上,只要你使用计时器,不要像你一直在做的那样强迫速度提高,就不会有什么问题,比如说,一个慢机器。计时器的滴答事件将被简单地延迟,您的有效FPS现在将设置您的绘画代码的速度。
通过计算实际经过的时间而不是依赖帧号,可以避免动画序列在慢速机器上花费更长的时间。无论是从Environment.TickCount还是DateTime.UtcNow,它们也以时钟中断速率进行更新。秒表也没问题,太过分了。动画就像在一台快速机器上一样长,看起来会更粗糙。
https://stackoverflow.com/questions/18162107
复制相似问题