我今天才注意到,当我编译并运行一个新的 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 可以减少不流畅的动画。
我已经查过了this forum thread , 但没有人找到好的解决方案。
有人遇到过这个问题吗?
编辑: 我做了一些更多的研究,我实现了一个 FPS 计数器(直到现在,我用 Fraps 测量它),我的计数器显示游戏以 60 FPS 运行(IsFixedTimeStep = true),所以这解决了 FPS 问题,但是高 CPU用法仍然存在。这可能发生在每个人身上吗?
最佳答案
根据 this discussion on XBox Live Indie Games forum ,显然在某些处理器(和操作系统)上,当使用默认值 Game.IsFixedTimeStep
时,XNA 在一个内核上占用 100% CPU 时间强>.
一个常见的解决方案(对我也适用)是将以下内容放入您的Game
构造函数中:
IsFixedTimeStep = false;
这是什么意思?
Game.IsFixedTimeStep
属性,当 true
时,确保您的框架(Update()
、Draw()
、...)在 处被调用在 Game.TargetElapsedTime
中指定的固定时间间隔。这默认为每秒 60 次调用。
当 Game.IsFixedTimeStep = false
时,对下一帧的调用将在前一帧完成时发生。这在下面的时间图中说明:
此更改如何影响我的代码?
所有固定时间计算(运动、计时等)都需要修改以适应可变时间步长。值得庆幸的是,这非常简单。
假设你有
Vector3 velocity;
Vector3 position;
对于某些对象,您正在更新位置
position += velocity;
默认情况下,这意味着您的对象的速度是 60 * velocity.Length()
单位每秒。您每秒增加 60 次速度。
当您将这句话翻译成代码时,您会得到这个简单的修改:
position += velocity * 60 * gameTime.ElapsedGameTime.TotalSeconds;
简单来说:您根据耗时缩放您添加的值。
通过在您执行移动(或计时等)的地方进行这些修改,您将确保您的游戏像固定时间步长时一样运行。
关于c# - XNA 的高 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8553998/