C# XNA的高CPU使用率

C# XNA的高CPU使用率,c#,windows,xna,cpu,frame-rate,C#,Windows,Xna,Cpu,Frame Rate,我今天刚刚注意到,当我编译并运行一个新的XNA4.0游戏时,其中一个CPU线程以100%的速度运行,帧速率降至54 FPS 奇怪的是,有时它的工作速度是60帧/秒,但后来却降到了54帧/秒 我以前没有注意到这种行为,所以我不知道这是否正常。我卸载了防病毒软件并重新安装了XNA Game Studio、XNA可再发行版和.NET Framework 4 如果我将IsFixedTimeStep设置为false,游戏以60 FPS的速度运行,CPU使用率最低(1-2%)。但据我所知,这需要我使用Ela

我今天刚刚注意到,当我编译并运行一个新的XNA4.0游戏时,其中一个CPU线程以100%的速度运行,帧速率降至54 FPS

奇怪的是,有时它的工作速度是60帧/秒,但后来却降到了54帧/秒

我以前没有注意到这种行为,所以我不知道这是否正常。我卸载了防病毒软件并重新安装了XNA Game Studio、XNA可再发行版和.NET Framework 4

如果我将IsFixedTimeStep设置为false,游戏以60 FPS的速度运行,CPU使用率最低(1-2%)。但据我所知,这需要我使用ElapsedGameTime进行速度计算,但我不知道怎么做,因为我对XNA相当陌生。但有人说,将其设置为false可以减少不稳定的动画

我已经检查过了,但是没有人找到一个好的解决方案

有没有人遇到过这个问题

编辑: 我做了更多的研究,实现了一个FPS计数器(到目前为止,我是用Fraps测量的),我的计数器显示游戏以60 FPS的速度运行(IsFixedTimeStep=true),因此这解决了FPS问题,但CPU使用率仍然很高。这是否可能发生在每个人身上?

根据,显然在某些处理器(和OS-s)上,当使用默认值
游戏时,XNA在一个内核上占用了100%的CPU时间。IsFixedTimeStep

一个常见的解决方案(对我来说也是有效的)是在你的
游戏
构造函数中加入以下内容:

IsFixedTimeStep = false;

这是什么意思? 当
true
时,该属性确保帧(
Update()
Draw()
,…)在
Game.targetReleasedTime
中指定的固定时间间隔内调用。这默认为每秒呼叫60次

Game.IsFixedTimeStep=false
时,将在前一帧完成时调用下一帧。下面的时间图说明了这一点:


此更改如何影响我的代码? 所有固定时间计算(移动计时等)都需要修改,以适应可变时间步长。谢天谢地,这非常简单

假设你有

Vector3 velocity;
Vector3 position;
对于某些对象,您正在使用

position += velocity;
默认情况下,这意味着对象的速度为
60*速度.Length()
单位/秒。每秒增加60次速度

当你把这个句子翻译成代码时,你会得到这样一个简单的修改:

position += velocity * 60 * gameTime.ElapsedGameTime.TotalSeconds;
简单地说:您正在根据经过的时间调整添加的值

通过在您执行移动(或计时等)的位置进行这些修改,您将确保您的游戏与固定时间步长时的游戏一样。

对于游戏而言,高CPU使用率(100%在一个内核上)是一个无问题的问题。换句话说,这是意料之中的。编写游戏时使用CPU的方式要求您这样做

打开代码环境并编写一个简单的程序

void main(){
    while(1) puts( "aaah" ) ;
}
打开CPU监视器,查看是否100%使用了一个内核

现在,您的游戏正在执行以下操作:

void main(){
    while(1){
        update() ;
        draw() ;

        while( getTimeElapsedThisFrame() < 1.0/60.0 ) ; // busy wait, until 16ms have passed
    }
}
void main(){
而(1){
更新();
draw();
while(getTimeLapsedThisFrame()<1.0/60.0);//忙碌等待,直到16ms过去
}
}
因此,基本上你调用
update()
draw()
,这占用了你计算一帧所需的大部分16毫秒(当你的游戏中有很多东西时,你会占用大部分时间)

现在因为(如果你调用
sleep(1ms)
,它实际上可能会在你的应用程序再次唤醒之前睡眠20ms),所发生的是游戏永远不会调用O/S系统功能
sleep
Sleep
功能会导致游戏“睡过头”,游戏会显得迟缓


好的CPU使用率不值得拥有一个无响应的游戏应用程序。因此,标准是“忙碌等待”,在占用CPU的同时缩短时间。

这确实让一切变得更加困难。到目前为止,我只需要将速度加到当前位置。真的没有其他方法来解决这个问题吗?将我的更新与GameTime集成是我的XNA应用程序有史以来最好的事情之一,它绝对值得(非常小的)移植。亲爱的上帝,它使用一个繁忙的循环来固定步骤?它默认使用它??微软,我还以为你更清楚呢!关于你的“编辑2”,我不知道固定的时间步长会如何影响速度——它仍然是相同的时间量,只是增量不同!您正在尝试修复一个非问题。游戏应用程序在一个内核上预期100%的CPU使用率。这个问题也让我很头疼,因为评测只能告诉我时间花在了框架代码中的某个地方。有趣的是,如果程序不在前台,它会继续正确更新/绘制/运行,但CPU使用率会下降到正常水平。您有多少内核?一般来说,当(1){update();draw();}
永不休眠(否则游戏将延迟)时,游戏的循环
,因此您应该期望至少100%的逻辑核心被利用。(所以,如果你有一个双核cpu,它应该是50%,双核超线程,应该是25%左右),我不同意。一个游戏可以是。如果它是GPU绑定的,这很可能是图形密集型游戏,那么CPU会将部分时间闲置。但是,即使在那些具有附加逻辑的系统中增加CPU时间,这也不是您的输入逻辑,因为每帧调用一次
Update()
。反应将保持不变。此外,设置
IsFixedTimeStep=false
会告诉XNA以尽可能快的速度调用帧(更新、绘制),而不是以固定的间隔。CPU绑定或GPU绑定仅参考