Comment savoir si la mémoire n'est pas gérée correctement?

12

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?

Patrick Jeeves
la source
1
Comment avez-vous déterminé l'utilisation de la RAM de votre application? Utilisez-vous un profileur (lequel?) Ou faites-vous simplement confiance au gestionnaire de tâches de votre système d'exploitation (lequel)?
Philipp
1
Gestionnaire de tâches sur kUbuntu, le profileur de mon débogueur me dit qu'il attend des données puis n'affiche jamais rien.
Patrick Jeeves
1
Soit dit en passant: lorsque vous vérifiez la consommation de mémoire sous Linux, n'oubliez pas de ne pas simplement regarder la mémoire consommée par le processus de jeu. Une fois, j'ai travaillé sur un jeu multiplateforme où nous nous demandions pourquoi la version Windows consomme tellement plus de RAM que la version Linux, jusqu'à ce que nous remarquions que la version Linux de notre API graphique allouait apparemment de la mémoire pour toutes les textures du processus X11.
Philipp
2
Vous ne devriez pas vous attendre à ce que glDeleteTextures libère réellement de la mémoire: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

Réponses:

21

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.

Stéphane Hockenhull
la source
1
Il convient de noter que si l'utilisation continue d'augmenter pendant la lecture, mais que les détecteurs de fuite ne trouvent toujours rien, vous pouvez souffrir d'une fragmentation excessive de la mémoire. Les approches pour résoudre un tel problème décrites sur stackoverflow.com/questions/150753/… seraient également utiles pour le développement de jeux.
Jules