附加调试器的C ++ / opengl应用程序运行更顺畅

时间:2012-01-13 22:30:02

标签: c++ opengl

您是否遇到过这样的情况,从Visual Studio执行C ++ opengl应用程序的运行速度更快,更顺畅?当正常执行时,没有调试器,我得到较低的帧速率,50而不是80,以及一个奇怪的滞后,其中fps每20-30帧跳跃到大约25帧/秒。有办法解决这个问题吗?

修改: 此外,我们使用了很多显示列表(使用glNewList创建)。增加显示列表的数量似乎增加了滞后。

修改: 问题似乎是由页面错误引起的。使用SetProcessWorkingSetSizeEx()调整流程工作集无济于事。

修改: 对于一些大型模型,使用procexp-utility的GPU内存使用情况很容易发现问题。当每帧有许多glCallList调用时,内存使用非常不稳定。没有添加新几何体,没有加载纹理,但是gpu-memory-allocation波动+ -20 MB。过了一会儿它变得更糟,并且可以一次分配150Mb之类的东西。

3 个答案:

答案 0 :(得分:3)

我相信您所看到的是调试器锁定某些页面,因此无法交换它们以便调试器立即访问。这在过程切换时为操作系统带来了一些警告,并且通常不会被推荐。

你可能不想听我说这个,但即使你这样做也没有好办法解决这个问题。

使用VBO,或者至少是顶点数组,可以期望在驱动程序中更好地优化那些(让我们面对它 - 显示列表已经过时)。可以轻松地包装显示列表以生成顶点缓冲区,因此只需要修改一些旧代码。此外,您可以使用“无绑定图形”来避免驱动程序中的页面错误(GL_EXT_direct_state_access)。

答案 1 :(得分:2)

你有机会获得nVidia显卡吗? nVidia OpenGL在连接到调试器时似乎使用了不同的实现。对我来说,非调试器版本在某些情况下以高达1 MB /秒的速度泄漏内存,在这种情况下我将绘制到前缓冲区并且不会在每帧中调用glClear。调试器版本绝对没问题。

我不知道为什么它需要分配和(有时)为一个没有改变的场景释放这么多内存。

我没有使用显示列表。

答案 2 :(得分:0)

这可能是线程或进程优先级。 Visual Studio可能会以稍高的优先级启动您的进程,以确保调试器具有响应能力。尝试在应用代码中使用SetPriorityClass()

SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);

“正常”课程只是在“正常”课程之前推动其他所有课程。正如文档所说,不要打击超高优先级,否则你可以搞砸系统的调度程序。

在以60 fps运行的应用程序中,你只需要16ms来绘制一个帧(减去80 fps!) - 如果需要更长的时间你丢弃帧,这可能导致帧速率小幅下降。如果您的应用程序具有与其他应用程序相同的优先级,则相对可能是另一个应用程序可能暂时窃取CPU以执行某项任务,并且您丢弃几帧或至少错过当前帧的16 ms窗口。这个想法稍微提升了优先级意味着Windows会更频繁地回到您的应用程序,因此它不会丢失任何帧数。