C++/opengl应用程序在附加调试器的情况下运行更流畅
C++/opengl application running smoother with debugger attached
您是否遇到过这样的情况,即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会更频繁地回到你的应用程序,这样它就不会掉那么多帧。
- 这个c++代码是如何在没有定义函数的情况下运行的
- 如果程序在没有 sudo 的情况下运行,gtk_init会导致 ubuntu 16.04 崩溃
- 如何在不闪烁的情况下运行ESP32的单元测试
- Qt qml - 在没有任何条件的情况下运行一行(while(true))
- while 循环是否在设置标志的情况下运行多次?
- 如果在不需要的情况下运行语句
- VS Code - 如何在不再次构建的情况下运行未更改的 c++ 文件
- 如何在不将其连接到终端的情况下运行'screen',以便我可以在C++ (qt) 应用程序中捕获输出?
- 我们可以在没有安装工具包的情况下运行CUDA加速程序
- opengl调用可以在没有GPU的情况下运行吗
- 在没有.NET框架的情况下运行.NET EXE应用程序
- 如何在不打开代码::块的情况下运行 c++ 程序
- 在没有系统调用的情况下运行sed
- 为什么在VS 2010 C++中,我的程序在调试器中运行良好时会崩溃,但在没有调试器的情况下运行时会崩溃
- OpenGL错误只在未经调试的情况下运行时出现,怎么可能呢
- 为什么可以在没有返回类型的情况下运行 /usr/include/c ++/5/bits/fstream.tcc 中
- 如何在不重载赋值运算符的情况下运行此代码
- Random_shuffle可以在没有库的情况下运行<algorithm>?
- 如何在不创建新进程的情况下运行程序集代码
- 如何在Windows中不显示cmd窗口的情况下运行带参数的外部程序