Freeglut,OpenGL和内存

时间:2013-08-30 09:03:07

标签: opengl freeglut

我已开始使用OpenGLGlew练习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();

1 个答案:

答案 0 :(得分: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位)。