Як дізнатись, чи правильно не обробляється пам'ять?


12

Схоже, що пам’ять пам’яті моєї (2D) гри збільшується кожного разу, коли я завантажую текстуру, наприклад, коли я запускаю гру, вона використовує приватну оперативну пам’ять на 30 Мб після передачі фонового файлу ~ 367 Мб, тому в деякий момент все знаходиться в оперативній пам’яті, вона збільшується до 54 Мб приватна оперативна пам’ять.

Те саме відбувається після проходження однієї і тієї ж відстані, але повторно повертаючись назад і назад між двома пунктами.

Однак мої показання показують, що програма правильно викликає glDeleteTextures приблизно за секунду після виходу текстури з екрану; і valgrind не знаходить ніяких витоків.

Як я можу знати, чи повинен я турбуватися з цього приводу, чи це лише придумка, як пам'ять сторінок ОС?


1
Як Ви визначили використання оперативної пам’яті у Вашому додатку? Ви використовуєте профайлер (який?) Чи просто довіряєте менеджеру завдань вашої операційної системи (який)?
Філіпп

1
Диспетчер завдань на kUbuntu, профілер на моєму відладчику каже мені, що він чекає даних, а потім ніколи нічого не відображає.
Патрік Джевз

1
До речі: Коли ви перевіряєте споживання пам’яті в Linux, пам’ятайте, щоб не просто дивитись на пам’ять, спожиту ігровим процесом. Одного разу, коли я працював над багатоплатформою, нам було цікаво, чому версія Windows споживає набагато більше оперативної пам’яті, ніж версія Linux, поки ми не помітили, що Linux-версія нашого графічного API, очевидно, виділила пам'ять для всіх текстур у процесі X11.
Філіпп

2
Ви не повинні сподіватися, що glDeleteTextures фактично звільнить пам’ять: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

Відповіді:


21

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

Бібліотеки розподілу в просторі користувачів також зберігають певний обсяг для повторного використання, щоб уникнути багаторазового вимагання та звільнення пам'яті з / в ОС, що надзвичайно повільно.

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

Це абсолютно нормально і хотілося. Невикористана оперативна пам’ять буде згодом використана вашим додатком.


1
Варто зазначити, що якщо використання продовжує збільшуватися під час гри, але детектори витоку все ще нічого не знаходять, ви можете страждати від надмірної фрагментації пам'яті. Підходи до вирішення такої проблеми, описані на сайті stackoverflow.com/questions/150753/… , також були б корисні для розвитку ігор.
Жуль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.