【问题标题】:Getting elapsed time between updates in wxWidgets在 wxWidgets 中获取更新之间经过的时间
【发布时间】:2014-08-25 21:36:15
【问题描述】:

我正在 Windows 上使用最新的 wxWidgets(3.0.1) 和 OpenGL(3.3) 构建交互式应用程序。我已经到了将 wxGLcanvas 渲染到 wxPanel 上的地步,它工作正常。渲染是在该 GLcanvas 的绘制事件中完成的。但是,我现在想在更新之间使用准确的增量时间执行模拟。

所以本质上我想要某种功能,让我拥有像这样的方法

void Update(float dt)
{
  // Update simulation with accurate time-step
}

我遇到过计时器,但我不确定如何将它整合到我的应用程序中以获得准确的dt。有些人提到为该面板创建一个单独的线程,以独立于应用程序的其余部分进行更新。这是一个选项吗?如果是这种情况,它是如何实现的?

【问题讨论】:

    标签: user-interface wxwidgets


    【解决方案1】:

    计时器精度应该足以达到至少 ~50 FPS,因此它们应该足以满足您的目的。您需要使用计时器来定期调用计时器事件处理程序,然后可以使用更准确的方法(因为不保证计时器完全正常)来确定是否需要更新,例如使用wxDateTime::UNow(),并在这种情况下排队Refresh()

    请注意,您仍然无法保证使用普通 GUI 框架定期刷新窗口。

    【讨论】:

      【解决方案2】:

      您使用的是什么操作系统? Windows 中无法保证事件的准确时间。然而,Unix 是一个实时操作系统 (RTOS),可以保证事件时间。

      您关心的增量时间范围是多少? RTOS 和 Windows 之间的区别只在不到 2 到 3 毫秒的时间内很重要(除非窗口变得荒谬地超载)因为任何有价值的 3D 场景都需要 3 毫秒以上的时间来渲染,所以这可能不是问题!

      在这类问题中最重要的是人类视觉的响应时间。观看诸如绘图之类的动态图表,人们不知道任何超过 300 毫秒的刷新率。如果您想尝试视频逼真的效果,您可能需要接近 25 毫秒的刷新率 - 但您的问题将不是您的计时器的准确性,而是您的场景渲染速度。所以,再一次,这不是问题。

      【讨论】:

      • 我正在使用 Windows。我已经编辑了问题以显示有问题的操作系统
      • 我希望更新之间大约有 16-17 毫秒,所以基本上是 60fps
      • 你能在 16 毫秒内渲染你的场景吗?
      • 是的,我可以.. 是创建一个计时器并调用 timer.Start(16) 的问题吗??
      • 是的。您的计时器事件处理程序将每 16 毫秒 +/- 5 毫秒调用一次。 stackoverflow.com/a/571935/16582
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2011-06-08
      相关资源
      最近更新 更多