opengl - Freeglut、OpenGL 和内存

标签 opengl freeglut

我已经开始练习了OpenGLGlewFreeglut .

我对我的应用程序有疑问,想知道是否有人遇到同样的问题(如果是的话)?

当我最初执行我的应用程序时,使用的内存约为 22,000 KB。在最小化我的窗口并再次最大化它之后,它只需要 2,900-3,300 KB 的内存,并且即使在再次最小化和最大化窗口以及在窗口具有焦点时执行鼠标和键盘输入之后也会继续这样做。

我想知道为什么会这样?我对 FreeGlut 不太了解,我想知道在使用 FreeGlut 最小化/最大化窗口时是否有其他人注意到这种行为。或者也许这是一个 OS-specific事物?

抱歉之前没有提及,但我使用的是 Windows XP SP3,并且我正在使用以下代码行设置 OpenGL 上下文:

glutInit(&argc, argv);
glutInitContextVersion(3, 3);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition(30, 30);
glutInitWindowSize(1000, 562);
glutCreateWindow("Testing");

glewExperimental = GL_TRUE;
glewInit();

最佳答案

这高度依赖于操作系统,也取决于您如何测量内存使用情况,但我可以让您了解一下为什么这可能会在 Microsoft Windows 上发生。对于使用基于 WDDM 的驱动程序的应用程序中的用户模式内存使用情况,Microsoft 有以下说法:

Existing games and other graphics applications frequently allocate virtual memory for a copy of the video memory resources that the application uses. The application uses this copy to restore the display quickly if the contents of video memory are lost. For example, the application uses this copy if the user presses ALT+TAB or if the user puts the computer in standby. Typically, the DirectX run time manages the copy on behalf of the application when the application creates a managed resource. However, an application can also manage the copy itself. The virtual memory that the copy uses is directly proportional to the video memory resources that the application allocates.



现在,虽然微软描述了这是一个 DirectX 问题,但它实际上也适用于 OpenGL。在幕后,OpenGL 通常完全透明地处理“设备丢失”事件(这不是 OpenGL 本身的一部分,而是窗口系统的一部分——在这种情况下为 WGL)。尽管您实际上可以在 OpenGL 4.x 的软件中使用您通常想要假装它们不存在的鲁棒性扩展之一接收这些事件。无论如何,我怀疑这是罪魁祸首。

您的内存消耗将根据您测量应用程序的内存消耗的方式而有很大差异,无论是简单地计算分配的虚拟内存页面的数量(虚拟大小),还是实际的驻留页面(工作/驻留集)。在 Windows 上,如果您在任务管理器中查看通常是衡量工作集的内存消耗。工作集是一个非常模糊的概念,通常是指“最近”引用的页数;它可以根据何时采样而增长/缩小,而不管在那个确切时刻实际驻留了多少内存。我会将这归结为正常的驾驶员行为,并意识到这种内存可能不会严重影响任何事情。

如果您在现代桌面 64 位平台 (x86-64) 上运行,您实际上拥有 48 位硬件地址空间 (256 TiB),操作系统将为您提供其中的一小部分(Windows 上为 8 TiB)供个人使用用户模式进程,因此 22,000 KiB 完全无关紧要(如果您实际上将软件编译为 64 位)。

关于opengl - Freeglut、OpenGL 和内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18528968/

相关文章:

c++ - 需要一些手持来渲染、显示和保存图像

c++ - 如何旋转然后朝那个方向移动?

c++ - 如何使用渲染缓冲区和 glBlit 渲染到四个窗口,使用 GLFW

opengl - glVertexAttribPointer 如何处理字节?

OpenGL代码未运行: OpenGL GLX extension not supported by display

c++ - 有很多过剩错误

java - C++ OpenGL - 获取对象的世界坐标(碰撞检测需要)

opengl - 当有几何着色器时,是否需要在顶点着色器中写入 `gl_Position`

c - 当正交设置为 -1.0 到 1.0 时获取鼠标位置

c++ - 为什么valgrind使用GLUT和PORTAUDIO报告我的内存肯定丢失了12或24个字节