Кажется, что объем памяти моей (2D) игры увеличивается каждый раз, когда я загружаю текстуру, например, когда я запускаю свою игру, она использует 30 МБ собственной ОЗУ, после того, как перешла ~ 367 МБ фонового файла, так что в какой-то момент все это находится в ОЗУ, оно увеличивается до 54 МБ приватной оперативной памяти.
То же самое происходит после того, как вы прошли одно и то же расстояние, но неоднократно переходили назад и вперед между двумя точками.
Однако мои показания показывают, что программа правильно вызывает glDeleteTextures примерно через секунду после того, как текстуры исчезают с экрана; и Вальгринд не находит никаких утечек.
Как я узнаю, следует ли мне беспокоиться об этом или это просто причуды памяти страниц ОС?
Ответы:
Виртуальная память выделяется из ОС большими порциями, когда даже байт остается все еще используемым в этом большом порции, он не может быть возвращен обратно в ОС.
Распределительные библиотеки в пользовательском пространстве также сохраняют определенное количество для повторного использования, чтобы избежать многократного запроса и освобождения памяти из / в ОС, что является чрезвычайно медленным.
Например, вы выделяете текстуру, драйвер OpenGL резервирует таблицу из 32 слотов текстур, вы продолжаете выделять текстуры, затем драйверу нужно выделять большую таблицу из 1024 слотов текстур, эта новая таблица теперь занимает место в большом куске оперативной памяти. Освободив все текстуры, драйвер не сжимает и не перераспределяет эту таблицу в ожидании того, что вашей игре / приложению потребуется использовать столько текстур позже, чтобы большой кусок оперативной памяти не мог быть возвращен обратно в ОС.
Это совершенно нормально и хотелось. Неиспользуемая ОЗУ будет в конечном итоге повторно использована вашим приложением.
источник