3

我目前正在开发一款使用 OpenTK 进行渲染的游戏;C#、.Net 4.0、OpenGL 2。

以 1280x1024 分辨率运行最大化(不是全屏,而是占用所有可用的屏幕空间),我看到平均大约 400 FPS。在 1680x1050 分辨率下,我看到平均大约 315 FPS。尽管帧速率很高,但我还是遇到了断断续续的口吃。

基本上,大约整整 3 秒,渲染会明显卡顿,然后在大约 0.5 到 1 秒内完全平滑。这个循环永远重复。

根据口吃,我的 FPS 计数器上没有显示帧率下降。我通过计算帧数来计算帧速率,直到达到所需的更新频率,然后使用每秒的滴答数、更新频率中的滴答数以及之前的帧数来计算帧速率算了。使用这种方法,我每隔一秒只会看到一次更新,但我从未见过帧速率下降到远低于我预期的水平。

如果我将游戏窗口拖到第二个显示器上,这个问题会显着加剧。

在 Release 版本中运行应用程序并没有解决问题。

我使用 redgate 的 ANTS 对应用程序进行了性能分析。这指出了我已经解决的一些问题。

这里有什么建议吗?

4

1 回答 1

3

这种卡顿一般是由垃圾收集器引起的。

监控您的收集计数并检查它们是否对应于口吃周期(调用 GC.CollectionCount() 并使用 0、1 和 2 作为参数)。如果这确实是原因,您将需要分析并减少内存分配(对象池在这里可以提供很大帮助,结构可以代替短期类)。

根据经验,您不希望在常规游戏过程中收集任何第 1 代或第 2 代收藏。

编辑:禁用软帧限制器(即调用 Run() 或 Run(60) 但不调用 Run(60, 60))并启用 vsync。这可能有助于减少口吃。

此外,确保两台显示器同步到相同的速率。将窗口从主显示器拖动到辅助显示器时,即使是微小的差异也会引入口吃(我已经看到这种情况发生在小到 60Hz 和 59.9Hz 的差异中)。

于 2010-12-24T23:25:22.183 回答