繁体   English   中英

XNA的CPU使用率很高

[英]High CPU usage with XNA

我今天刚刚注意到,当我编译并运行一个新的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可以减少抖动动画。

我已经检查了这个论坛帖子 ,但没有人找到一个好的解决方案。

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

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

根据对XBox Live Indie Games论坛的讨论 ,显然在一些处理器(和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(当你的游戏中有很多东西时你占用大部分时间)。

现在因为O / S睡眠分辨率不准确 (如果你叫sleep( 1ms ) ,它实际上可能会在你的应用程序再次唤醒之前睡眠20ms ),会发生的事情是游戏永远不会调用O / S系统功能Sleep Sleep功能会让您的游戏“过度睡眠”,游戏会出现滞后和缓慢。

良好的CPU使用率不值得拥有一个反应迟钝的游戏应用程序。 所以标准是“忙等待”并且在占用CPU时缩短时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM