首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OnPaint中的Winforms?

OnPaint中的Winforms?
EN

Stack Overflow用户
提问于 2013-08-10 12:56:51
回答 1查看 1.6K关注 0票数 1

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

在修正了几个慢点后,我想对我的结果进行基准测试。我的画被困在了65 FPS (这是完美的,但我在基准)。我在计时器(设置为1ms)中使我的对象失效,并使用受保护的重写无效OnPaint -“方法”重新绘制我的东西。

在此之后,我将失效()放入受保护的覆盖无效OnPaint中。在此之后,FPS被设为几千家。但是使用这种方法会导致屏幕空。

我的问题是:这个问题是否故意的?这将是合理的,因为任何高于您的屏幕刷新是浪费权力。但我想禁用这个“锁”作为我的基准。

样本代码:

代码语言:javascript
复制
//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++;
    }

谢谢

~史蒂夫

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,它们也以时钟中断速率进行更新。秒表也没问题,太过分了。动画就像在一台快速机器上一样长,看起来会更粗糙。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18162107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档