Como sei se a memória não está sendo manipulada corretamente?

12

A pegada de memória do meu jogo (2D) parece aumentar sempre que carrego uma textura, por exemplo, quando inicio o jogo, ele usa 30 MB de RAM privada, depois de atravessar um arquivo em segundo plano de ~ 367 mb, então está tudo na RAM em algum momento, aumenta 54 MB de RAM privada.

O mesmo acontece depois de percorrer a mesma distância, mas alternando entre dois pontos repetidamente.

No entanto, minhas leituras estão mostrando que o programa está chamando corretamente glDeleteTextures cerca de um segundo depois que as texturas saem da tela; e valgrind não está encontrando vazamentos.

Como sei se devo me preocupar com isso ou se é apenas uma peculiaridade de como o sistema operacional pagina a memória?

Patrick Jeeves
fonte
1
Como você determinou o uso de RAM do seu aplicativo? Você está usando um criador de perfil (qual?) Ou apenas confia no gerenciador de tarefas do seu sistema operacional (qual)?
Philipp
1
Gerenciador de tarefas no kUbuntu, o criador de perfil no meu depurador me diz que está aguardando dados e nunca exibe nada.
Patrick Jeeves
1
A propósito: Ao verificar o consumo de memória no Linux, lembre-se de não olhar apenas para a memória consumida pelo processo do jogo. Uma vez que trabalhei em um jogo multiplataforma, ficamos imaginando por que a versão do Windows consome muito mais memória RAM do que a do Linux, até que notamos que a versão Linux da nossa API de gráficos aparentemente alocava memória para todas as texturas no processo X11.
Philipp
2
Você não deve esperar que o glDeleteTextures realmente libere memória: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

Respostas:

21

A memória virtual é alocada a partir do sistema operacional em grandes blocos, quando mesmo um byte é deixado ainda em uso nesse grande bloco, ele não pode ser liberado de volta para o sistema operacional.

As bibliotecas de alocação no espaço do usuário também mantêm uma certa quantia para reutilização, para evitar repetidamente exigir e liberar memória de / para o SO, o que é extremamente lento.

Por exemplo, você aloca uma textura, o driver OpenGL reserva uma tabela de 32 slots de textura, você continua alocando texturas, o driver precisa alocar uma tabela maior de 1024 slots de textura. Essa nova tabela agora está ocupando espaço no grande espaço da RAM. libere todas as texturas, o driver não está encolhendo nem realocando a tabela na expectativa de que seu jogo / aplicativo precise usar tantas texturas posteriormente, para que grande parte da RAM não possa ser liberada de volta ao sistema operacional.

Isso é perfeitamente normal e desejado. A RAM não utilizada será reutilizada eventualmente pelo seu aplicativo.

Stephane Hockenhull
fonte
1
É importante notar que, se o uso continuar aumentando durante a reprodução, mas os detectores de vazamento ainda não encontrarem nada, você pode estar sofrendo de fragmentação excessiva da memória. As abordagens para solucionar um problema descrito em stackoverflow.com/questions/150753/… também seriam úteis para o desenvolvimento de jogos.
Jules