L'empreinte mémoire de mon jeu (2D) semble augmenter à chaque fois que je charge une texture, par exemple lorsque je démarre mon jeu, il utilise 30 Mo de RAM privée, après avoir traversé un fichier d'arrière-plan ~ 367 Mo, il est donc tout en RAM à un moment donné, il augmente à RAM privée de 54 Mo.
La même chose se produit après avoir parcouru la même distance mais en faisant des allers-retours répétés entre deux points.
Cependant, mes lectures montrent que le programme appelle correctement glDeleteTextures environ une seconde après que les textures aient disparu de l'écran; et valgrind ne trouve aucune fuite.
Comment savoir si je dois m'inquiéter à ce sujet, ou si c'est juste une bizarrerie de la façon dont la mémoire des pages du système d'exploitation?
Réponses:
La mémoire virtuelle est allouée à partir du système d'exploitation en gros morceaux, quand même un octet est encore utilisé dans ce gros morceau, il ne peut pas être libéré de nouveau sur le système d'exploitation.
Les bibliothèques d'allocation dans l'espace utilisateur gardent également une certaine quantité à réutiliser pour éviter d'exiger et de libérer de la mémoire de / vers le système d'exploitation, ce qui est extrêmement lent.
Par exemple, vous allouez une texture, le pilote OpenGL réserve une table de 32 emplacements de texture, vous continuez d'allouer des textures, le pilote doit ensuite allouer une plus grande table de 1024 emplacements de texture, cette nouvelle table prend maintenant de la place dans le gros morceau de RAM, vous libérez toutes les textures, le pilote ne rétrécit pas et ne réalloue pas cette table dans l'attente que votre jeu / application devra utiliser autant de textures plus tard afin que de gros morceaux de RAM ne puissent pas être libérés vers le système d'exploitation.
C'est parfaitement normal et voulu. La RAM inutilisée sera éventuellement réutilisée par votre application.
la source