Freeglut、OpenGL和内存

8

我开始使用 GlewFreeglut 来练习 OpenGL

我有一个关于我的应用程序的问题,想知道是否有人遇到了同样的问题(如果这是一个问题的话)?

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

我想知道这是为什么?我不太了解 FreeGlut,想知道是否有其他人在最小化/最大化 FreeGlut 窗口时注意到了这种行为。或者这可能是一个特定于操作系统的问题?

抱歉之前没有提到,我正在使用 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();

你使用哪个操作系统?你如何设置你的GL上下文(即,你向FreeGLUT传递什么参数)? - thokra
你如何测量内存使用情况,为什么要担心这个问题?现代系统应该至少有2GB的RAM。在我的8GB机器上,22000 KB占总内存使用量的0.27%。你可以简单地忽略它。 - SigTerm
@jozxyqk: "也许自动最小化"。不,自动最小化会惹恼用户。您绝不希望惹恼用户。 - SigTerm
@SigTerm:除非你使用的是像32位Windows这样的操作系统...当你的进程地址空间被限制在2 GiB,并且与显示驱动程序共享一部分地址空间时,那22,000 KiB就会显得更多。不过,在大多数情况下,这并不是什么值得担心的事情。 - Andon M. Coleman
@AndonM.Coleman:推荐阅读:32位Windows系统下程序可以拥有超过2GB的可用空间 - SigTerm
显示剩余7条评论
1个回答

4
这个问题高度依赖于操作系统,还取决于你如何测量内存使用情况,但我可以向你提供一些关于为什么在Microsoft Windows上可能会发生这种情况的见解。Microsoft对基于WDDM驱动程序的应用程序中用户模式内存使用情况有以下说法:
现有的游戏和其他图形应用程序经常分配虚拟内存以备份应用程序使用的视频内存资源。如果视频内存的内容丢失,应用程序将使用此副本快速恢复显示。例如,如果用户按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位)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接