c# - 基于 OpenTK 的游戏间歇性卡顿

标签 c# opengl profiling profiler opentk

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

在 1280x1024 分辨率下最大化运行(不是全屏,而是占用所有可用的屏幕空间),我看到平均帧率为 400 FPS。在 1680x1050 分辨率下,我看到的平均帧率约为 315 FPS。尽管帧速率如此之高,但我仍遇到间歇性卡顿。

基本上,在大约 3 整秒的时间内,渲染会出现明显的断断续续,然后在大约 0.5 到 1 秒内完全平滑。这个循环永远重复。

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

如果我将游戏窗口拖到我的第二个显示器上,问题会显着恶化。

在发布版本中运行应用程序未解决问题。

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

这里有什么建议吗?

最佳答案

这种卡顿一般是垃圾收集器造成的。

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

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

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

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

关于c# - 基于 OpenTK 的游戏间歇性卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4522782/

相关文章:

c# - 使用无名参数执行存储过程

opengl - 如何查询OpenGL模板缓冲区的深度

c++ - 游戏引擎 map 编辑器。 SDL->wxWidgets

c++ - 需要帮助破译 gprof 输出

c++ - 在 C++ 中处理大量的执行时间分析

c# - 在 C# 中序列化嵌套类?

c# - FileSystemWatcher 监视 UNC 路径

c# - 模拟基于 Atom 的 pc 环境

delphi - 什么可以使带有 VBO 的 glDrawArrays 无法绘制任何内容?

c++ - C++ 中的运行时内存分析