Freeglut,OpenGL和内存

Sec*_*ven 8 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();
Run Code Online (Sandbox Code Playgroud)

And*_*man 4

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

现有的游戏和其他图形应用程序经常为应用程序使用的视频内存资源的副本分配虚拟内存。如果视频内存的内容丢失,应用程序将使用此副本快速恢复显示。例如,如果用户按 ALT+TAB 或用户将计算机置于待机状态,则应用程序将使用此副本。通常,当应用程序创建托管资源时,DirectX 运行时代表应用程序管理副本。然而,应用程序也可以管理副本本身。副本使用的虚拟内存与应用程序分配的视频内存资源成正比。

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

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

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