XNA计时如何工作?

red*_*man 5 c# xna

XNA如何保持一致且精确的60 FPS帧速率?此外,如何在不将CPU固定在100%的情况下保持如此精确的时序?

luk*_*uke 2

我不知道 XNA 具体是如何做到的,但是几年前在使用 OpenGL 时,我使用一些非常简单的代码完成了同样的事情。

在它的核心,我假设 XNA 有某种渲染循环,它可能会也可能不会与标准偶数处理循环集成,但为了举例,我们假设它不是。在这种情况下,你可以这样写。

TimeSpan FrameInterval =  TimeSpan.FromMillis(1000.0/60.0);
DateTime PrevFrameTime = DateTime.MinValue;
while(true)
{
    DateTime CurrentFrameTime = DateTime.Now;
    TimeSpan diff = DateTime.Now - PrevFrameTime;
    if(diff < FrameInterval)
    {
        DrawScene();
        PrevFrameTime = CurrentFrameTime;
    }
    else
    {
        Thread.Sleep(FrameInterval - diff);
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,您可能会使用诸如Environment.Ticks之类的东西而不是DateTimes(它会更准确),但我认为这说明了这一点。这应该每秒只调用大约 60 次drawScene,其余时间线程将处于休眠状态,因此不会产生任何 CPU 时间。