XNA Platformer(2D) - 帧速率/ FPS波动

时间:2011-02-23 07:53:16

标签: c# xna xbox360

我是C Sharp的新手,并且正在编写一个带有XNA Framework的游戏。我创建了一个项目,它是“Platformer”XNA入门套件的一个经过大量修改的版本。

我看到(似乎)随帧速率的随机波动。有时它一直以60 FPS的速度运行,有时它会从60 FPS开始然后降到49-52,而其他时间它会立即降到49-52。使用Fraps显示帧率(不将视频录制到磁盘)。

这款游戏的独特之处在于它始终以60 FPS的速度运行。

因此,似乎某些竞争条件或随机因素导致exe的各个运行之间存在差异。无数的重建没有任何区别。

这种波动在我的台式机和笔记本电脑上发生频率完全相同,所以这不是硬件,防病毒等问题。

我已经搜索了如何在XNA中锁定帧率,我的代码似乎正在做很多需要做的事情,包括尝试钳制60 FPS(使用IsFixedTimeStep,SynchronizeWithVerticalRetrace)。

游戏从头到尾绝对能够达到60 FPS,我一直都在看。当它以60 FPS运行时,就我所知,它不会对CPU,RAM或任何其他资源征税。

其他人经历过这个?

谢谢, - S

7 个答案:

答案 0 :(得分:2)

您描述的不一致意味着问题是由

引起的
  • 诸如另一个过程的环境因素;或
  • 游戏中不会在每次运行时使用的代码路径

最可能的原因是两台计算机上都运行了另一个进程。

关闭所有非必要的流程,例如媒体播放器。 Windows Media Player和iTunes都可以在播放时降低帧速率。 Fraps应该没问题,只要它没有录制,但我会实现你自己的内置FPS显示,以确保。

使用Windows性能监视器检查是否有进程占用cpu或内存。特别要查找未能正常关闭且仍在后台运行的游戏实例。

您可以尝试缩小环境原因的其他事项包括:

  • 确定游戏是否以60fps运行 干净重启后
  • 确定是否 游戏总是以60fps的速度运行 第一次运行
  • 启动您的游戏 探险家而不是视觉工作室
  • 确定是否在Release或中运行 调试模式有任何影响
  • 运行你的 在朋友的电脑上玩游戏

如果原因来自游戏中的代码路径,那么每次运行都不会执行:

  • 反复播放并尝试确定你在游戏中做什么导致减速。
  • 实现输入录制和回放系统,以便在游戏中运行完全可重复的
  • 描述您的垃圾收集和一般性能,以查找突出的任何问题

答案 1 :(得分:1)

我会检查这些周期性减速是否与GC事件一致,特别是第1代或第2代。从您所描述的内容来看,这似乎是合理的。如果是这样,请查看是否可以通过重用,堆栈分配等来减少代码中的对象流失。

答案 2 :(得分:1)

我遇到了完全相同的问题。我创建了一个基于Platformer入门套件的游戏,我使用的是Windows 7.该程序大部分时间都以60 FPS的速度运行,但有时它会下降到52 FPS大约30秒,然后就会出现回到60 FPS。

我发现通过关闭Windows 7 Aero功能,我的游戏现在始终保持在60 FPS。我不得不切换到没有Aero的Windows 7 Basic主题,现在游戏运行得很顺畅。

答案 3 :(得分:0)

你可以完全回避这个问题。只要您的游戏以至少35 fps的速度运行,帧速率下降将不会被人眼注意到。为了回避这个问题,请确保所有更新代码都考虑到它传递的GameTime对象。通常你会乘以任何计算,以便在帧速率较高时获得较小的计算,并在游戏缓慢更新时获得更明显的结果。总的来说,它会让你的游戏视觉效果更加流畅。

您是否尝试过让游戏以最高帧率运行?如果是这样,你还会收到巨大的帧率下降吗?如果你不知道怎么做,我可以在你回家时发布代码。

答案 4 :(得分:0)

尝试禁用V同步SynchronizeWithVerticalRetrace=false并查看是否有帮助。如果事件在同步时发生或者帧有时太长而无法渲染,V同步会产生令人讨厌的副作用,即大幅降低帧速率,因为它必须等待下一次同步。但是,您可能会经历撕裂。但是,如果帧率稳定性比撕开自由显示更重要,那么这可能是一个很好的折衷方案。

答案 5 :(得分:0)

你是否在可见区域之外绘制任何东西?我有同样的问题(帧率会突然下降)。在尝试了一切之后,事实证明我有时会在可见区域之外或在屏幕的可见区域和不可见区域之间绘制内容。鉴于您正在使用平台游戏初学者套件,这可能也是您的问题。

答案 6 :(得分:0)

你永远无法强制游戏以60 fps的速度运行。

如果游戏真的需要以这个速度运行,你可能每帧更新游戏状态。如果是这样,您应该将其更改为考虑经过时间的更新。