8

我已经开始OpenGL练习Glewand Freeglut

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

当我最初执行我的应用程序时,使用的内存约为 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();
4

1 回答 1

4

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

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

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

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

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

于 2013-08-30T13:09:55.803 回答