Необъяснимый 16 МБ памяти в приложении cocos2d? - PullRequest
2 голосов
/ 16 марта 2011

Я занимаюсь разработкой приложения на основе cocos2d и сейчас проверяю его с помощью инструмента Allocations Tool, чтобы проверить наличие утечек.Я заметил, что есть моменты, в которых происходит malloc 16 МБ, и я не могу сказать, почему.Я предполагаю, что это что-то связанное со структурой Cocos, но я не уверен в этом.

Вы когда-нибудь испытывали такое же поведение?Иногда приложение вылетает из-за этого во время тестов.

Заранее спасибо

Андреа

Некоторые дополнительные сведения

Кажется, проблема связана с тем, как Cocos кэширует спрайты.Я использую текстурный атлас zwoptex.Вот стек вызовов

+[CCSpriteSheet spriteSheetWithFile:capacity:] CCSpriteSheet.m:69 
-[CCSpriteSheet initWithFile:capacity:] CCSpriteSheet.m:104 
-[CCTextureCache addImage:] CCTextureCache.m:243 
-[CCTexture2D(Image) initWithImage:] CCTexture2D.m:207 
-[CCTexture2D(Image) initPremultipliedATextureWithImage:pixelsWide:pixelsHigh:]    

В этот момент выполнения я загружаю самый большой спрайт, который у меня есть.Это около 900 КБ.Пока других очень мало.Я неправильно использую кокосовые орехи?Например, есть параметры, направленные на снижение таких пиков.Однако я ожидаю, что после кэширования изображение не будет загружаться в любое время, когда мне это нужно.Вместо этого я испытываю новые пики каждый раз, когда я не использую такой спрайт в течение некоторого времени.Затем я предположил, что кэш не будет очищен, если я повторно создаю изображение, но, несмотря на то, что я сохраняю его, malloc все еще происходит.

Я также хотел бы знать, почему объем ОЗУ приложения изменяется с 3 МБ до 80 МБ при работе на симуляторе вместо устройства

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Я испытал то же самое, когда использовал iSimulate (для регистрации данных акселерометра и мультитач (> 2) и передачи в iSimulator).

0 голосов
/ 22 марта 2011

Хорошо, наверное, я могу ответить на мой вопрос

Я нашел этот метод в делегате приложения, автоматически генерируемом при создании нового проекта cocos2d

-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    [[CCDirector sharedDirector] purgeCachedData];
}

Похоже, что, как только приложение получает предупреждение о памяти, кэш очищается. Поэтому, когда я создаю свой спрайт размером 900 КБ, в первый раз выделяется 16 МБ (все еще очень странно), и когда несколько раз во время выполнения выдается предупреждение о памяти, кэш очищается, и он должен загрузить его снова. Это имеет для вас какой-то смысл?

В любом случае, я прокомментировал это, и игра кажется быстрее, очевидно, я должен очень хорошо проверить, нет ли утечек памяти, но я на самом деле в этом уверен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...