代码之家  ›  专栏  ›  技术社区  ›  Istrebitel

C#.Net有没有办法知道已经显示了多少监视器帧,或者在屏幕上显示一定数量的帧?

  •  0
  • Istrebitel  · 技术社区  · 12 年前

    我需要在屏幕上显示一个精确的、非常小的时间间隔。必须使用具有固定刷新率(对于这项任务来说相对较慢)的显示器,这将是一个限制因素,我必须允许用户在多个“帧”中设置显示时间(对于60Hz的显示器,=16,(6)ms)。

    我最初考虑只使用精确计时器(基于Stopwatch类),但问题是,(据我所知)没有办法知道实际显示了多少帧——所以如果我显示了21毫秒的东西,我有大约25%的机会实际显示2帧(33,3毫秒),有大约75%的机会显示1帧(16,6毫秒),这取决于刷新16,6ms间隔与我的21ms间隔的对齐方式。

    我知道这可能可以用directX/opengl等中的Vsync来完成,但如果可能的话,我希望使用简单的windows窗体。那么,有没有办法找出一段时间以来显示了多少帧,或者截取监视器上绘制的新帧的事件,或者手动命令重新绘制帧或类似的事情?

    1 回复  |  直到 12 年前
        1
  •  1
  •   Nikita B    12 年前

    你所说的“监视器框架”是什么意思还不太清楚。

    如果您想测量监视器的刷新率,那么没有太多可测量的内容。这是一个固定的数字,在一定程度上取决于显示器型号和显示设置。您可以查找它,也可以使用win-api调用以编程方式获取它: http://msdn.microsoft.com/en-us/library/dd162611%28v=VS.85%29.aspx 。刷新率不受软件的影响。

    如果你想测量fps,那么你需要一个计时器(例如。 StopWatch )以及帧计数。您可以通过每次刷新屏幕时增加一些变量来获得后者。 OnPaint 你的表单中的方法很可能是你可以做到这一点的地方之一。Fps不受监视器的影响(除非您启用了VSync)。

    如果你想测量fps,不包括由于刷新率低而跳过的帧。。。然后,我认为可以安全地假设,如果刷新率低于fps,则该值等于刷新率,如果刷新速率高于fps,那么该值等于fps。