Как я могу узнать, правильно ли обрабатывается память?

12

Кажется, что объем памяти моей (2D) игры увеличивается каждый раз, когда я загружаю текстуру, например, когда я запускаю свою игру, она использует 30 МБ собственной ОЗУ, после того, как перешла ~ 367 МБ фонового файла, так что в какой-то момент все это находится в ОЗУ, оно увеличивается до 54 МБ приватной оперативной памяти.

То же самое происходит после того, как вы прошли одно и то же расстояние, но неоднократно переходили назад и вперед между двумя точками.

Однако мои показания показывают, что программа правильно вызывает glDeleteTextures примерно через секунду после того, как текстуры исчезают с экрана; и Вальгринд не находит никаких утечек.

Как я узнаю, следует ли мне беспокоиться об этом или это просто причуды памяти страниц ОС?

Патрик Дживс
источник
1
Как вы определили использование оперативной памяти вашего приложения? Вы используете профилировщик (какой?) Или просто доверяете диспетчеру задач вашей операционной системы (какой)?
Филипп
1
Диспетчер задач в kUbuntu, профилировщик в моем отладчике говорит мне, что ждет данных, а затем ничего не отображает.
Патрик Дживс
1
Кстати, когда вы проверяете потребление памяти в Linux, не забывайте не просто смотреть на память, потребляемую процессом игры. Однажды я работал над многоплатформенной игрой, где нас удивляло, почему версия Windows потребляет гораздо больше памяти, чем версия Linux, пока мы не заметили, что версия нашего графического API для Linux явно выделяла память для всех текстур в процессе X11.
Филипп
2
Вы не должны ожидать, что glDeleteTextures действительно освободит память: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

Ответы:

21

Виртуальная память выделяется из ОС большими порциями, когда даже байт остается все еще используемым в этом большом порции, он не может быть возвращен обратно в ОС.

Распределительные библиотеки в пользовательском пространстве также сохраняют определенное количество для повторного использования, чтобы избежать многократного запроса и освобождения памяти из / в ОС, что является чрезвычайно медленным.

Например, вы выделяете текстуру, драйвер OpenGL резервирует таблицу из 32 слотов текстур, вы продолжаете выделять текстуры, затем драйверу нужно выделять большую таблицу из 1024 слотов текстур, эта новая таблица теперь занимает место в большом куске оперативной памяти. Освободив все текстуры, драйвер не сжимает и не перераспределяет эту таблицу в ожидании того, что вашей игре / приложению потребуется использовать столько текстур позже, чтобы большой кусок оперативной памяти не мог быть возвращен обратно в ОС.

Это совершенно нормально и хотелось. Неиспользуемая ОЗУ будет в конечном итоге повторно использована вашим приложением.

Стефан Хоккенхалл
источник
1
Стоит отметить, что если использование продолжает расти во время игры, но детекторы утечки все еще ничего не находят, вы можете страдать от чрезмерной фрагментации памяти. Подходы к решению такой проблемы, описанные на stackoverflow.com/questions/150753/… , также будут полезны для разработки игр.
Жюль