c# - XNA 的高 CPU 使用率

标签 c# windows xna cpu frame-rate

我今天才注意到,当我编译并运行一个新的 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 时,对下一帧的调用将在前一帧完成时发生。这在下面的时间图中说明:

enter image description here


此更改如何影响我的代码?

所有固定时间计算(运动计时等)都需要修改以适应可变时间步长。值得庆幸的是,这非常简单

假设你有

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/

相关文章:

python - 如何获取开始菜单程序目录的路径?

windows - "Windows is searching for a solution ..."的幕后?

c# - 选择一个随机方向并移动

c# - 类型函数<类型>()

c# - LINQ 如何根据给定条件对项目进行排序?

c# - ASP.net MVC 将单元格内容作为 Grid.MVC 中的链接

windows - 从 Mercurial 迁移后,Git 在 Windows 11 上无法正确识别带变音符号的文件

c# - 我的加速度计代码有什么问题?

c# - 使用键的克隆从哈希表中检索值; C#

c# - C# 匿名方法是面向对象的吗?