Ślad pamięci mojej gry (2D) wydaje się zwiększać za każdym razem, gdy ładuję teksturę, np. Kiedy uruchamiam grę, używa ona 30 MB prywatnej pamięci RAM, po przeniesieniu pliku tła ~ 367 MB, więc w pewnym momencie jest w pamięci RAM, wzrasta do 54 MB prywatnej pamięci RAM.
To samo dzieje się po przejściu tej samej odległości, ale wielokrotnym przechodzeniu do przodu i do tyłu między dwoma punktami.
Jednak moje odczyty pokazują, że program poprawnie wywołuje glDeleteTextures około sekundę po tym, jak tekstury znikną z ekranu; a valgrind nie znajduje wycieków.
Skąd mam wiedzieć, czy powinienem się tym martwić, czy to tylko dziwactwo pamięci stron systemu operacyjnego?
Odpowiedzi:
Pamięć wirtualna jest przydzielana z systemu operacyjnego w dużych porcjach, gdy nawet bajt pozostaje w użyciu w tym dużym fragmencie, nie można go zwolnić z powrotem do systemu operacyjnego.
Biblioteki alokacji w przestrzeni użytkownika również zachowują pewną ilość do ponownego użycia, aby uniknąć wielokrotnego wymagania i zwalniania pamięci z / do systemu operacyjnego, co jest bardzo wolne.
Np. Przydzielasz teksturę, sterownik OpenGL rezerwuje tabelę z 32 miejscami na teksturę, wciąż przydzielasz tekstury, sterownik musi następnie przydzielić większą tabelę z 1024 miejscami na tekstury, ta nowa tabela zajmuje teraz miejsce w dużej części pamięci RAM, ty po zwolnieniu wszystkich tekstur sterownik nie zmniejsza ani nie przydziela tej tabeli ponownie w oczekiwaniu, że twoja gra / aplikacja będzie musiała użyć tylu tekstur później, aby duża część pamięci RAM nie mogła zostać zwolniona z powrotem do systemu operacyjnego.
Jest to całkowicie normalne i pożądane. Niewykorzystana pamięć RAM zostanie w końcu ponownie wykorzystana przez Twoją aplikację.
źródło