XNA 平台游戏(2D)- 帧率/FPS 波动

5
我是新手C#,正在使用XNA框架编写游戏。我创建了一个项目,这是“平台游戏”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

1
你能使用FRAPS的帧时间设置收集更多数据吗?另外:如果你正在使用V-sync,并且掉了一帧,你的帧率将立即减半。如果它只持续了几分之一秒,那么该秒报告的帧率将介于30和60 FPS之间。 - Andrew Russell
这个游戏的独特性要求它始终以60帧每秒的速度运行。真的吗?我很好奇这个原因是什么。 - Justin
7个回答

2
您所描述的不一致性意味着问题可能是由以下原因之一引起的:
  • 环境因素,例如其他进程;或
  • 游戏中未在每次运行时都执行的代码路径
最有可能的原因是另一个正在两台计算机上运行的进程。
关闭所有非必要的进程,如媒体播放器。Windows Media Player和iTunes在播放时都会降低帧率。只要Fraps没有录制,那么它应该是可以的,但我建议您实现自己内置的FPS显示,以确保其正常工作。
使用Windows性能监视器检查是否有进程消耗CPU或内存。特别注意游戏的实例是否未能正确关闭并仍在后台运行。
其他可尝试缩小环境原因范围的方法包括:
  • 确定游戏在干净的重新启动后是否以60fps运行
  • 确定游戏是否始终在第一次运行时以60fps运行
  • 从资源管理器而不是Visual Studio启动游戏
  • 确定在Release模式还是Debug模式下运行是否会产生任何影响
  • 在朋友的计算机上运行游戏
如果原因是游戏中未在每次运行时都执行的代码路径,则可以:
  • 反复播放并尝试确定在游戏中触发减速的操作。
  • 实现输入记录和回放系统,以使游戏的同一运行过程完全可重复
  • 对垃圾收集和总体性能进行分析,查找任何明显的问题

1

我曾经遇到过完全相同的问题。我基于平台游戏起始套件创建了一个游戏,并且我使用的是Windows 7。程序大部分时间以60 FPS运行良好,但有时会降至52 FPS约30秒钟,然后又回到60 FPS。

我发现关闭Windows 7 Aero功能后,我的游戏现在可以保持稳定的60 FPS。我不得不切换到没有Aero的Windows 7基本主题,现在游戏运行得非常流畅。


1
我会检查这些周期性的减速是否与GC事件重合,特别是第1或第2代。从你所描述的情况来看,这似乎是相当可能的。如果是这样,请尝试通过重用、堆栈分配等方式减少代码中的对象翻转。

0
你有没有在可见区域之外绘制任何东西?我曾经遇到过同样的问题(帧速率会突然下降)。尝试了所有方法后,发现有时候我会在可见区域之外或屏幕可见和不可见区域之间的位置绘制一些东西。考虑到你正在使用平台游戏入门套件,这很可能也是你的问题所在。

0

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

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


0

你可以完全避开这个问题。只要你的游戏运行时最低帧率达到35帧,人眼就不会注意到帧率下降。为了避免这个问题,确保所有更新代码都考虑到传递的GameTime对象。通常情况下,你需要将任何计算乘以它,这样当帧率高时,你会得到更小的计算结果,而当游戏更新缓慢时,你会得到更明显的结果。总体来说,这将使你的游戏视觉效果更加流畅。

你尝试过让游戏以最大帧率运行吗?如果是这样,你仍然会遇到巨大的帧率下降吗?如果你不知道如何做到这一点,我可以在回家后发布代码,如果你需要的话。


0

尝试禁用垂直同步SynchronizeWithVerticalRetrace=false,看看是否有帮助。垂直同步会有一个不好的副作用,如果在同步时间发生事件或者一帧渲染时间稍微长了一点,它会显著降低你的帧率,因为它必须等待下一次同步。然而,你可能会遇到撕裂现象。但是,如果帧率稳定性比无撕裂显示更重要,那么这可能是一个很好的折衷方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接