我正在通过OpenGL Superbible 5th ed工作。有示例代码在屏幕上显示旋转环面。为确保旋转与处理器速度无关,旋转量基于时间。我的问题:在下面的示例代码中,我如何“确定”将正确的时间传递给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);
答案 0 :(得分:2)
只需将计时器查询尽可能靠近您使用它的位置,然后不要过于担心它。请注意,在60 Hz时,您每16毫秒只绘制一帧,因此步长的粒度至少相当。在主要运行此应用程序的计算机上(而不是由其他进程加载),上下文切换时间不会产生显着差异。
如果您考虑一下,那么您的用户空间应用程序应该能够做什么,以确保您的执行不会被其他进程中断。上下文切换由内核处理,为了公平起见,任何用户空间进程都不应该“占用”所有执行时间 - 上下文切换应该完全透明。
答案 1 :(得分:1)
如果一切正常,你不需要担心操作系统在rotTimer.GetElapsedSeconds()和计算之间做某事。 “rotTimer.GetElapsedSeconds()”将返回在你的东西和其他任务上花费的累积延迟。但是你必须对所有基于时间的操作使用相同的值(每帧只调用一次.GetElapsedSeconds()并在每个帧上使用它的值)。
你应该担心的是延迟可能太大或太小。有几种方法可以解决这个问题。最简单的是设置最大帧长度。像这样:
float yRot = max(rotTimer.GetElapsedSeconds(), 0.3f) * 60.0f;
答案 2 :(得分:0)
默认情况下,没有什么可以防止其他进程在程序运行时运行。不要这样做,但如果您确实需要使用Windows API函数SetPriorityClass和SetThreadPriority,则可以更改进程优先级以抢占计算机上的任何其他进程。将这些设置为实时是杀死计算机的好方法。 : - )