Предупреждение памяти при инициализации нескольких анимаций для спрайта - PullRequest
0 голосов
/ 19 марта 2012

Я создаю приложение, которое имеет около 15 различных анимаций.Некоторые анимации воспроизводятся при нажатии кнопок, а некоторые - на определенное событие.Поскольку я новичок в cocos2d, я просто не могу понять, как инициализировать эти анимации.У меня есть отдельные листы спрайтов для каждой анимации.Что я сделал, так это создал вспомогательный класс, имеющий в качестве члена данных объект CCSprite.И в функции инициализации я поместил весь код для создания анимации.Но как только вызывается функция init, я получаю предупреждение о памяти.

Я даже пытался инициализировать анимации только при отправке запроса на воспроизведение анимации, но я все еще получаю предупреждение о памяти.Кроме того, если я сделаю это, анимация не будет воспроизводиться, пока не будет загружен весь спрайт.

Пожалуйста, проверьте следующий код для справки

    - (void)initEntryAnimation
    {
        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"entry.plist"];
        CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"entry.png"];
        [self.sardarSprite addChild:spriteSheet];

        NSMutableArray *entryFrames = [NSMutableArray array];
        for(int i = 0; i < 77; i++) {

            if([[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
            [NSString stringWithFormat:@"enter in scene%04i.png", i+1]])
            [entryFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
            [NSString stringWithFormat:@"enter in scene%04i.png", i+1]]];
        }

        self.entryAnimation = [CCAnimation animationWithFrames:entryFrames delay:0.05f];
    }

    - (void)playEntryAnimation
    {
        [CCSpriteFrameCache purgeSharedSpriteFrameCache];

        [self.sardarSprite runAction:[CCAnimate actionWithAnimation:self.entryAnimation restoreOriginalFrame:NO]];
    }

Я создал аналогичные функции для всех 15анимации.Я вызываю все функции инициализации одну за другой.И функции воспроизведения вызываются всякий раз, когда отправляется запрос на анимацию.

Мне очень нужен совет специалиста.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

Проблема в размере ваших спрайтов.Размер файла спрайт-листа (размер png) может быть очень маленьким, но это размер на диске.Как только ваше приложение загрузит это в память, оно будет сохранено в несжатом виде, так что для каждого листа спрайта будет 2048x2048x8.

Вы можете уменьшить глубину цвета до RGBA4444, например, что может помочь.Смотрите TexturePacker для более подробной информации.Доступны и другие инструменты (я никак не связан с TexturePacker).

Другие возможные варианты: дальнейшее уменьшение глубины цвета или использование одного из других доступных форматов.Вы также можете посмотреть на свои анимации и посмотреть, есть ли способ разбить их на более отдельные компоненты.Например, если у вас есть анимация бегущего человека, возможно, вместо полноэкранных кадров, у вас может быть один кадр туловища, а затем различные анимации ног и анимации рук, которые вы затем используете.

Не зная точной анимации, советовать сложно.

0 голосов
/ 19 марта 2012

Попробуйте добавить NSAutoreleasePool следующим образом

- (void)initEntryAnimation
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"entry.plist"];
        CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"entry.png"];
        [self.sardarSprite addChild:spriteSheet];

        NSMutableArray *entryFrames = [NSMutableArray array];
        for(int i = 0; i < 77; i++) {

            if([[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
            [NSString stringWithFormat:@"enter in scene%04i.png", i+1]])
            [entryFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
            [NSString stringWithFormat:@"enter in scene%04i.png", i+1]]];
        }

        self.entryAnimation = [CCAnimation animationWithFrames:entryFrames delay:0.05f];
        [pool release];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...