基于OpenTK的游戏间歇性地断断续续

时间:2010-12-23 22:03:52

标签: 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描述了应用程序。这指出了我已经解决的一些问题。

这里有什么建议吗?

1 个答案:

答案 0 :(得分:3)

这种口吃通常是由垃圾收集器引起的。

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

根据经验,在常规游戏过程中,您不需要任何gen-1或gen-2集合。

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

此外,请确保两台显示器同步到相同的速率。将窗口从主显示器拖到辅助显示器时,即使是轻微的差异也会引起口吃(我看到这种情况发生在60Hz与59.9Hz之间的差异)。