Я работаю над 2D-игрой для iPhone, использующей OpenGL ES, и продолжаю превышать лимит памяти в 24 МБ - мое приложение продолжает сбой с кодом ошибки 101. Я очень старался найти, куда идет память, но цифры в инструментах все еще намного больше, чем я ожидал.
Я запустил приложение с инструментами Memory Monitor, Object Alloc, Leaks и OpenGL ES. Когда приложение загружается, объем свободной физической памяти уменьшается с 37 МБ до 23 МБ, выделение объектов составляет около 7 МБ, утечки показывают две или три утечки размером в несколько байтов, размер объекта Gart составляет около 5 МБ, а монитор памяти сообщает, что Приложение занимает около 14 МБ реальной памяти. Я озадачен тем, куда делась память - когда я копаюсь в распределении объектов, большая часть памяти находится в текстурах, как я и ожидал. Но и мой собственный счетчик выделения текстур, и размер объекта Gart согласны с тем, что текстуры должны занимать где-то около 5 МБ.
Я не знаю о выделении чего-либо еще, о чем стоило бы упомянуть, и Object Alloc соглашается. Куда уходит память? (Я был бы рад предоставить более подробную информацию, если этого недостаточно.)
Обновление: Я действительно пытался найти, где я мог бы выделить столько памяти, но безрезультатно. Что меня бесит, так это разница между распределением объектов (~ 7 МБ) и реальным использованием памяти, как показывает монитор памяти (~ 14 МБ). Даже если бы были огромные утечки или огромные порции памяти, о которых я забыл, все равно должен отображаться в распределении объектов , не так ли?
Я уже попробовал обычного подозреваемого , т.е. UIImage
с его кешированием, но это не помогло. Есть ли способ отслеживать использование памяти в «стиле отладчика», построчно, отслеживая влияние каждого оператора на использование памяти?
Что я нашел до сих пор:
Я действительно , я использую столько памяти. Нелегко измерить реальное потребление памяти, но после долгих подсчетов я думаю, что потребление памяти действительно такое высокое. Моя вина.
Я не нашел простого способа измерения используемой памяти. Номера монитора памяти точны (это действительно важные цифры), но монитор памяти не может сказать вам, куда именно идет память. Инструмент Object Alloc практически бесполезен для отслеживания реального использования памяти. Когда я создаю текстуру, выделенный счетчик памяти некоторое время увеличивается (считывает текстуру в память), затем падает (передает данные текстуры в OpenGL, освобождает). Это нормально, но не всегда происходит - иногда использование памяти остается высоким даже после передачи текстуры в OpenGL и освобождения из «моей» памяти. Это означает, что общий объем памяти, выделенный, как показано инструментом Object Alloc, меньше, чем реальное общее потребление памяти, но больше, чем реальное потребление минус текстуры (real – textures < object alloc < real
). Иди цифрой.
Я неправильно прочитал Руководство по программированию. Ограничение памяти в 24 МБ относится к текстурам и поверхностям, а не ко всему приложению. Фактическая красная линия лежит немного дальше, но я не смог найти никаких точных цифр. По общему мнению, потолок составляет 25–30 МБ.
Когда системе не хватает памяти, она начинает отправлять предупреждение памяти. Мне почти нечего освободить, но другие приложения возвращают часть памяти в систему, особенно Safari (которая, кажется, кэширует сайты). Когда свободная память, как показано на мониторе памяти, обнуляется, система начинает убивать.
Мне пришлось стиснуть зубы ипереписать некоторые части кода для большей эффективности в памяти, но я, вероятно, все еще настаиваю на этом. Если бы я разработал другую игру, я бы наверняка подумал о подкачке ресурсов. С текущей игрой это довольно сложно, потому что объект постоянно находится в движении, и загрузка текстур мешает, даже если это делается в другом потоке. Мне было бы интересно узнать, как другие люди решают эту проблему.
Обратите внимание, что это только мои взгляды, которые не должны быть очень точными. Если я узнаю что-то еще по этой теме, я уточню вопрос. Я оставлю вопрос открытым на тот случай, если кто-то, кто понимает проблему, захочет ответить, так как это все обходные пути и догадки, чем все остальное.