XNA的CPU使用率很高

我刚刚注意到,当我编译并运行一个新的XNA 4.0游戏时,其中一个CPU线程以100%的速度运行,并且帧率下降到54 FPS。

奇怪的是,有时候它的工作速度是60 FPS,但是却只能达到54 FPS。

我之前没有注意到这个行为,所以我不知道这是否正常。 我卸载了我的杀毒软件,并重新安装了XNA Game Studio,XNA Redistributable和.NET Framework 4。

如果我将IsFixedTimeStep设置为false,则游戏运行速度为60 FPS,CPU使用率最低(1-2%)。 但据我所知,这需要我使用ElapsedGameTime来进行速度计算,但是我不知道该怎么做,因为我对XNA还是比较陌生的。 但有人说,将其设置为false会减less生涩的animation。

我已经检查了这个论坛主题 ,但没有人find一个好的解决scheme。

有没有人遇到过这个问题?

编辑:我做了一些更多的研究,我实现了一个FPS计数器(直到现在,我用Fraps测量),我的计数器显示游戏运行在60 FPS(与IsFixedTimeStep = true),所以这解决了FPS问题,但高CPU使用率仍然存在。 这有可能发生在每个人身上吗?

Solutions Collecting From Web of "XNA的CPU使用率很高"

根据对XBox Live独​​立游戏论坛的讨论 ,显然在一些处理器(和OS-s) 上,当 使用 Game.IsFixedTimeStep 的默认值时, XNA 在一个内核上占用100%的CPU时间

一个常见的解决方案 (也适用于我)是将以下内容放在您的Game构造函数中:

 IsFixedTimeStep = false; 

这是什么意思?

Game.IsFixedTimeStep属性如果为true ,则确保在Game.TargetElapsedTime指定的固定时间间隔内调用帧( Update()Draw() ,…)。 这默认为每秒60个呼叫

Game.IsFixedTimeStep = false ,当前一个完成时,将会发生下一帧的调用。 如下图所示:

在这里输入图像说明


这个改变如何影响我的代码?

所有固定的时间计算( 运动时间等)将需要修改以适应可变的时间步长。 谢天谢地, 这很简单

假设你有

 Vector3 velocity; Vector3 position; 

对于某个对象,你正在更新位置

 position += velocity; 

默认情况下,这意味着你的对象的速度是 60 * velocity.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 } } 

所以基本上你调用update()draw() ,并且占用16ms的大部分时间,你必须计算一个帧(当你的游戏中有很多东西的时候,你占用大部分时间)。

现在由于操作系统的睡眠分辨率并不准确 (如果你打电话进入sleep( 1ms ) ,在你的应用程序再次醒来之前它可能实际上睡了20ms ),那么游戏就不会把O / S系统的Sleep功能称为SleepSleep功能会导致游戏“睡过头”,游戏会显得迟缓而缓慢。

良好的CPU使用率是不值得有一个不响应的游戏应用程序。 所以标准就是“忙等待”,同时削减CPU占用时间。