C++/opengl应用程序在附加调试器的情况下运行更流畅

C++/opengl application running smoother with debugger attached

本文关键字:情况下 运行 调试器 opengl 应用程序 C++      更新时间:2023-10-16

您是否遇到过这样的情况,即C++opengl应用程序在visual studio中执行时运行得更快、更流畅?当正常执行时,在没有调试器的情况下,我会得到较低的帧速率,从80变为50,还有一个奇怪的滞后,即fps每20-30帧下降到大约25帧/秒。有办法解决这个问题吗?

编辑:此外,我们还使用了相当多的显示列表(使用glNewList创建)。增加显示列表的数量似乎会增加滞后。

编辑:这个问题似乎是由页面错误引起的。使用SetProcessWorkingSetSizeEx()调整进程工作集没有帮助。

编辑:对于一些大型模型,使用procexp实用程序的GPU内存很容易发现问题。当每帧有许多glCallList调用时,内存使用非常不稳定。没有添加新的几何体,没有加载纹理,但gpu内存分配波动+-20兆字节。过了一段时间,情况会变得更糟,可能会一次性分配150Mb。

我相信您看到的是调试器锁定了一些页面,因此无法将它们交换为调试器可以立即访问的页面。这在进程切换时给操作系统带来了一些警告,通常不建议使用。

你可能不喜欢听我这么说,但没有好的方法来解决这个问题,即使你这样做了。

使用VBO,或者至少使用顶点数组,这些可以在驱动程序中得到更好的优化(让我们面对现实吧,显示列表正在过时)。显示列表可以很容易地包装以生成顶点缓冲区,因此只需要修改一小部分旧代码。此外,您还可以使用"无绑定图形",这是为了避免驱动程序中的页面错误(GL_EXT_direct_state_access)。

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

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

我没有使用显示列表。

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

SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);

"高于正常"类只是将它推到了"正常"类的前面。正如文档中所说,不要使用超高优先级,否则可能会破坏系统的调度程序。

在一个以60帧/秒的速度运行的应用程序中,绘制一帧的时间只有16毫秒(在80帧/秒时更少。如果你的应用程序与其他应用程序具有相同的优先级,那么相对而言,另一个应用程序可能会暂时窃取某些任务的CPU,而你会丢失一些帧,或者至少错过当前帧的16毫秒窗口。这个想法是稍微提高优先级意味着Windows会更频繁地回到你的应用程序,这样它就不会掉那么多帧。