我如何知道内存处理不正确?


12

每当我加载纹理时,我的(2D)游戏的内存占用似乎都在增加,例如,当我启动游戏时,在穿越〜367mb的背景文件后,它使用30 mb的专用RAM,因此有时它全部在RAM中,它会增加到54 mb专用RAM。

在经过相同的距离但在两个点之间反复来回之后,会发生相同的事情。

但是,我的读数显示,纹理退出屏幕后大约一秒钟,该程序正确地调用了glDeleteTextures。valgrind没有发现任何泄漏。

我怎么知道我是否应该为此担心,或者这仅仅是操作系统页面存储方式的怪癖?


1
您如何确定应用程序的RAM使用率?您是在使用探查器(哪个)?还是仅信任操作系统的任务管理器(哪个)?
菲利普

1
kUbuntu上的任务管理器,调试器上的探查器告诉我它正在等待数据,然后再也不显示任何内容。
Patrick Jeeves

1
顺便说一句:在Linux上检查内存消耗时,请记住不要仅仅查看游戏进程消耗的内存。一次我从事多平台游戏的工作时,我们想知道为什么Windows版本比Linux版本消耗的内存要多得多,直到我们注意到图形API的Linux版本显然为X11进程中的所有纹理分配了内存。
菲利普

2
你应该没有期望glDeleteTextures实际上会释放内存:gamedev.stackexchange.com/questions/136883/...
鲆按蚊

Answers:


21

虚拟内存是从操作系统中按大块分配的,即使在该大块中甚至一个字节仍在使用中,也无法将其释放回操作系统。

用户空间中的分配库还保留一定数量的重用空间,以避免重复请求和向OS释放内存,这是非常缓慢的。

例如,您分配了一个纹理,OpenGL驱动程序保留了一个32个纹理插槽的表,您继续分配纹理,然后驱动程序需要分配一个更大的1024个纹理插槽的表,这个新表现在占用了大块RAM中的空间,您释放所有纹理,驱动程序不会缩小或重新分配该表,因为期望您的游戏/应用程序以后需要使用尽可能多的纹理,以使无法将大块RAM释放回操作系统。

这是完全正常和通缉的。未使用的RAM最终将由您的应用程序重新使用。


1
值得一提的是,如果在播放过程中使用率继续增加,但是检漏器仍然找不到任何内容,则可能会导致内存碎片过多。stackoverflow.com/questions/150753/…中描述的解决此类问题的方法也将对游戏开发有用。
Jules
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.