Skąd mam wiedzieć, czy pamięć nie jest właściwie obsługiwana?

12

Ś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?

Patrick Jeeves
źródło
1
Jak określiłeś użycie pamięci RAM przez aplikację? Czy używasz profilera (który?), Czy po prostu ufasz menedżerowi zadań swojego systemu operacyjnego (który)?
Philipp
1
Menedżer zadań na kUbuntu, profiler mojego debuggera mówi mi, że czeka na dane, a następnie niczego nie wyświetla.
Patrick Jeeves,
1
Przy okazji: sprawdzając zużycie pamięci w systemie Linux, pamiętaj, aby nie patrzeć tylko na pamięć zużywaną przez proces gry. Pewnego razu, gdy pracowałem nad grą wieloplatformową, zastanawialiśmy się, dlaczego wersja Windows zużywa o wiele więcej pamięci RAM niż wersja Linux, dopóki nie zauważyliśmy, że wersja Linux naszego graficznego interfejsu API najwyraźniej przydzieliła pamięć dla wszystkich tekstur w procesie X11.
Philipp
2
Nie należy się spodziewać, że glDeleteTextures rzeczywiście zwolni
Maximus Minimus

Odpowiedzi:

21

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ę.

Stephane Hockenhull
źródło
1
Warto zauważyć, że jeśli użycie nadal rośnie podczas gry, ale detektory przecieków nadal niczego nie znajdują, możesz cierpieć z powodu nadmiernej fragmentacji pamięci. Podejścia do rozwiązania takiego problemu opisane na stronie stackoverflow.com/questions/150753/... byłyby również przydatne w tworzeniu gier.
Jules