1

我目前正在尝试完善我的应用程序并提高其性能。基本上,它是一个高级图形类。它画了几条线并刷新它们。

在修复了一些慢点之后,我想对我的结果进行基准测试。我的绘图卡在〜65 FPS(这是完美的,但我正在做基准测试)。我在计时器中使我的对象无效(设置为 1 毫秒)并使用受保护的覆盖 void OnPaint -“方式”重绘我的东西。

之后,我将 Invalidate() 放入受保护的覆盖 void 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++;
    }

谢谢

〜史蒂夫

4

1 回答 1

7

我的绘图卡在 ~65 FPS

是的,这很正常。您正在测量操作系统的时钟中断率。在大多数 Windows 机器上,它每秒滴答 64 次。计时器不能比这更快,Interval 属性的最小有用值是 15。将其设置为 1 无效,它仍然仅每 15.625 毫秒计时一次。

您实际上可以提高中断率并使计时器的分辨率更好。您必须调用 timeBeginPeriod()。然而,这毫无意义,人类无法观察到差异。但是,用户笔记本电脑上的电池会消耗得更快。

明智的做法是使用​​用的更新率。人眼的速度达到每秒约 20 帧,之后它就会变得模糊。或者看起来很流畅,这取决于你正在做什么样的更新。在电影院中利用的东西,它以 24 fps 的速度更新。因此,实际的 Interval 属性值略低于预期时钟中断率的倍数。即 2 x 15.625 = 31 毫秒或 32 fps。3 x 15.625 = 46 毫秒或 21 fps。您不想随意将这些数字变小,如果您这样做,您的程序在不同机器上的更新率将不会一致。

如果你的绘画代码跟不上这个速度,你只需要优化你的代码。只要您使用计时器并且不要像您一直在做的那样试图强制提高速度,那么实际上就不会出现任何问题,例如,一台速度较慢的机器。计时器的 Tick 事件将简单地延迟,您的有效 FPS 现在将由您的绘画代码的速度设置。

您可以通过计算实际经过的时间而不是依赖帧数来避免动画序列在慢速机器上花费更长的时间。无论是来自 Environment.TickCount 还是 DateTime.UtcNow,它们也以时钟中断速率更新。秒表也可以,太矫枉过正了。然后,动画将与在快速机器上一样长,只是看起来更粗糙。

于 2013-08-10T14:27:29.023 回答