0

我正在通过 OpenGL Superbible 第 5 版工作。有在屏幕上显示旋转圆环的示例代码。为确保旋转发生独立于处理器速度,旋转量基于时间。我的问题:在下面的示例代码中,我怎样才能“确定”正确的时间将传递给m3dRotationMatrix44() 方法?也就是说,在 之后rotTimer.GetElapsedSeconds(),是什么阻止了操作系统处理其他任务,然后返回到m3dRotationMatrix44()?或者,这是用于教程目的的基本计时技术吗?如果是这样,还有什么其他方法存在?

// Set up time based animation
static CStopWatch rotTimer;
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;

// <initialize some stuff>

// Create a rotation matrix based on the current value of yRot
m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0.0f, 1.0f, 0.0f);
4

3 回答 3

1

如果一切正常,您无需担心操作系统会在 rotTimer.GetElapsedSeconds() 和计算之间进行操作。“rotTimer.GetElapsedSeconds()”将返回花费在你的东西和其他任务上的累积延迟。但是您必须在每帧上对所有基于时间的操作使用相同的值(每帧只调用一次 .GetElapsedSeconds() 并在任何地方使用它的值)。

您应该警惕的是延迟可能太大或太小。有几种方法可以解决这个问题。最简单的是设置最大帧长。像这样的东西:

float yRot = max(rotTimer.GetElapsedSeconds(), 0.3f) * 60.0f;
于 2013-02-05T05:19:53.083 回答
1

只需将计时器查询放在尽可能靠近您使用它的位置,然后不要太担心它。请注意,在 60 Hz 时,无论如何您只是每 16 毫秒绘制一帧,因此您的步骤的粒度至少是这么多。在主要运行此应用程序(而不由其他进程加载)的机器上,上下文切换时间不会产生显着差异。

如果您考虑一下,您的用户空间应用程序实际上并不能做任何事情来保证您的执行不会被另一个进程中断。上下文切换由内核处理,为了公平起见,任何用户空间进程都不应该能够“占用”所有执行时间——上下文切换应该对它完全透明。

于 2013-02-04T18:47:22.813 回答
0

当您的程序默认运行时,没有什么可以阻止其他进程运行。不要这样做,但如果您确实需要使用 Windows API 函数 SetPriorityClass 和 SetThreadPriority,则可以更改进程优先级以抢占计算机上的任何其他进程。将这些设置为实时是杀死计算机的好方法。:-)

于 2013-02-07T19:36:31.407 回答