【问题标题】:XNA Platformer (2D) - Framerate/FPS fluctuationsXNA Platformer (2D) - 帧率/FPS 波动
【发布时间】:2011-02-23 07:53:15
【问题描述】:

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

【问题讨论】:

  • 您可以使用 FRAPS 的帧时间设置收集更多数据吗?另外:如果您使用垂直同步,并且丢帧,您的帧率将立即减半。如果它在几分之一秒内执行此操作,则该秒报告的帧速率将介于 30 到 60 FPS 之间。
  • “这款游戏的独特性要求它始终以 60 FPS 运行。”真的吗?我很好奇这是什么原因。

标签: c# xna xbox360


【解决方案1】:

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

引起的
  • 环境因素,例如另一个过程;或
  • 游戏中并非每次运行都采用的代码路径

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

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

使用 windows 性能监视器检查是否有进程消耗 cpu 或内存。尤其要查找无法正常关闭但仍在后台运行的游戏实例。

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

  • 确定游戏是否以 60fps 运行 干净重启后
  • 确定是否 游戏始终以 60fps 的速度运行 第一次运行
  • 从 资源管理器而不是视觉工作室
  • 确定是在 Release 中运行还是 调试模式有什么影响
  • 运行您的 在朋友的电脑上玩游戏

如果原因是您游戏中的代码路径并非在每次运行时都执行,您可以:

  • 反复玩游戏并尝试确定您在游戏中所做的事情会触发减速。
  • 实现输入记录和播放系统,以便在游戏中进行相同的运行完全可重复
  • 分析您的垃圾收集和一般性能以查找任何突出的问题

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我遇到了完全相同的问题。我基于 Platformer 初学者工具包创建了一个游戏,我使用的是 Windows 7。该程序大部分时间以 60 FPS 运行良好,但有时它会下降到 52 FPS 约 30 秒,然后它会运行回到 60 FPS。

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

      【讨论】:

        【解决方案4】:

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

        您是否尝试过让游戏以最大帧率运行?如果是这样,您仍然会收到巨大的帧率下降吗?如果您不知道如何执行此操作,如果您需要,我可以在回家时发布代码。

        【讨论】:

          【解决方案5】:

          尝试禁用垂直同步SynchronizeWithVerticalRetrace=false 看看是否有帮助。如果在同步时间发生事件或者如果帧稍微太长而无法渲染,则垂直同步具有令人讨厌的副作用,因为它必须等待下一次同步。但是,您可能会经历撕裂。但是,如果帧率稳定性比无撕裂显示更重要,那可能是一个很好的折衷方案。

          【讨论】:

            【解决方案6】:

            您是否在可见区域之外绘制任何内容?我有同样的问题(帧率会突然下降)。在尝试了一切之后,结果发现我有时会在可见区域之外或屏幕可见区域和不可见区域之间的中间绘制东西。鉴于您使用的是平台游戏入门工具包,这可能也是您的问题。

            【讨论】:

              【解决方案7】:

              您将永远无法强制游戏以 60 fps 运行。

              如果游戏确实需要以这种速度运行,您可能需要每帧更新游戏状态。如果是这样,您应该将其更改为考虑已用时间的更新。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-08-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多