C++/opengl应用程序运行更流畅,附带调试器 您是否经历过这样的情况,C++ VisualStudio执行时,C++ OpenGL应用程序运行得更快更顺畅?在没有调试器的情况下,正常执行时,我会得到较低的帧速率,50而不是80,还有一个奇怪的延迟,即fps每20-30帧下降到大约25帧/秒。有办法解决这个问题吗

C++/opengl应用程序运行更流畅,附带调试器 您是否经历过这样的情况,C++ VisualStudio执行时,C++ OpenGL应用程序运行得更快更顺畅?在没有调试器的情况下,正常执行时,我会得到较低的帧速率,50而不是80,还有一个奇怪的延迟,即fps每20-30帧下降到大约25帧/秒。有办法解决这个问题吗,c++,opengl,C++,Opengl,编辑: 此外,我们还使用了相当多的显示列表(使用glNewList创建)。增加显示列表的数量似乎会增加滞后 编辑: 这个问题似乎是由页面错误引起的。使用SetProcessWorkingSetSizeEx()调整进程工作集没有帮助 编辑: 对于一些大型型号,procexp实用程序的GPU内存使用情况很容易发现问题。当每帧有许多glCallList调用时,内存使用非常不稳定。不添加新几何体,不加载纹理,但gpu内存分配波动+-20 MB。过了一段时间,情况变得更糟,可能会一次性分配150Mb的内存

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

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

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

这可能是线程或进程的优先级。VisualStudio可能会以略高的优先级启动进程,以确保调试器具有响应性。尝试在应用程序的代码中使用:

SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
“高于正常”类只是用“正常”类将其推到其他类之前。正如文档中所说,不要设置超高优先级,否则可能会破坏系统的调度程序


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

我相信你看到的是调试器锁定了一些页面,因此调试器无法立即访问这些页面。这在进程切换时给操作系统带来了一些警告,通常不推荐这样做

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


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

您是否有nVidia图形卡?nVidia OpenGL在连接到调试器时似乎使用了不同的实现。对我来说,在某些情况下,非调试器版本会以高达1 MB/秒的速度泄漏内存,在这种情况下,我会将内存提取到前端缓冲区,并且不会在每个帧调用glClear。调试器版本是绝对好的

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


而且我没有使用显示列表。

在调试器中,您是全屏运行还是不全屏运行?这意味着V-sync被启用。不是全屏,而是最大化。在这两种情况下都应禁用V-sync。有时我的fps速率超过100,但仍然滞后。您应该使用Process Explorer之类的工具查看在这两种情况下加载了哪些DLL,以及是否从不同的路径加载了相同的DLL。所有DLL文件似乎都匹配。只有在从Visual Studio执行时才会出现几个dll:audiodev.dll、WMVCORE.dll、wpdshext.dll、GdiPlus.dll、WMASF.dll。理论上,这些不应该影响opengl渲染的平滑度。此常见问题解答表明,对于显示列表,内存抖动通常是性能限制的一个方面。也许您的应用程序从父进程继承了一些内存优先级或缓存大小。尝试以管理员身份启动应用程序,或从VisualStudio命令行启动应用程序,以查看是否存在任何差异。另外,请尝试查看任务管理器中的内存参数,例如页面错误,并查看是否存在任何显著差异。这似乎是合理的,但您的答案与调试/发布版本之间的性能差异有什么关系?没有帮助。当与visual studio分开执行时,Fps速率仍然“不稳定”。顺便说一句,我一直在使用发行版,但可以从visual studio执行,也可以正常执行。同时更改SetProcessPriorityBoost也没有帮助。谢谢!我确认在某些条件下,nVidia OpenGL驱动程序在发行版和调试版之间有很大的性能差异(x100)。我有一个使用皮肤动画的OpenGL项目,它将在两台不同的基于nVidia的Windows机器上以.4FPS的速度运行。然而,该项目将在AMD机器或我的Macbook的nVidia硬件上以大约30FPS的速度运行。然而,在Windows/nVidia机器上,如果我在Unity的Profiler窗口打开的情况下运行项目,它将从.4FPS加速到30FPS,如果我通过OpenGL调试工具运行单机版,它也将以30FPS的速度运行。@RiazRizvi我目前遇到了类似的问题,我想知道您使用的是哪种OpenGL调试工具?这是不久前,但我认为这是免费的。我的结论是,Window为调试而构建的OpenGL DLL对于蒙皮动画的性能优于发行版,因为通过调试工具运行项目会导致加载OpenGL驱动程序的调试版本。尽管这是两年前的事了,但不确定是否仍然如此。