WedX - журнал о программировании и компьютерных науках

CCRenderTexture съедает мою память

Я пытаюсь визуализировать текстуры в фоновом потоке в cocos2d, и все идет хорошо, за исключением того, что по какой-то причине я не могу выпустить текстуры, когда они больше не используются.

Сначала я загружаю два изображения асинхронно, затем я запускаю фоновую задачу, в которой я визуализирую новое изображение. Как я уже сказал, все работает нормально, проблема в том, что мое приложение вылетает после вызова этих функций несколько раз. Я понятия не имею, как сделать дополнительную очистку. Выход из моей доступной памяти говорит мне, что я каждый раз теряю от 10 до 15 МБ (gfx1 и gfx2 - это полноэкранные фоны сетчатки).

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

Текстуры - это NSMutableArray. У меня есть текстура с индексом 0, визуализирую новую и добавляю ее в позицию 1. После замены спрайта я пытаюсь убить свою (теперь старую) текстуру с индексом 0, и моя новая текстура становится с индексом 0, поэтому я могу запустить эту функцию заново.

Итак, вот код

- (void) startBuildingTextureInBackground {
    [[CCTextureCache sharedTextureCache] addImageAsync:@"gfx1.png"
                                                target:self
                                              selector:@selector(imageLoaded:)];
}

- (void) imageLoaded: (id) obj {
    rtxTexture1 = [[CCTextureCache sharedTextureCache] textureForKey:@"gfx1.png"];
    [[CCTextureCache sharedTextureCache] addImageAsync:@"gfx2.png"
                                                target:self
                                              selector:@selector(imageLoaded2:)];
}

- (void) imageLoaded2: (id) obj {
    rtxTexture2 = [[CCTextureCache sharedTextureCache] textureForKey:@"gfx2.png"];
    [self performSelectorInBackground:@selector(buildRtxTexture) withObject:nil];
}

- (void) buildRtxTexture {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    EAGLSharegroup *sharegroup = [[[[CCDirector sharedDirector] openGLView] context] sharegroup];
    EAGLContext *k_context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:sharegroup] autorelease];
    [EAGLContext setCurrentContext:k_context];
    [[CCDirector sharedDirector] setGLDefaultValues];

    CCSprite* gfx1 = [CCSprite spriteWithTexture:rtxTexture1];
    [rendernode addChild:gfx1];

    CCSprite* gfx2 = [CCSprite spriteWithTexture:rtxTexture2];
    [rendernode addChild:gfx2];

    CCRenderTexture* rtx = [CCRenderTexture renderTextureWithWidth:512
                                                            height:320
                                                       pixelFormat:kTexture2DPixelFormat_RGBA4444];

    [rtx beginWithClear:0 g:0 b:0 a:0];
    [rendernode visit];

    [rtx end];

    [rendernode removeChild:gfx1 cleanup:YES];
    [rendernode removeChild:gfx2 cleanup:YES]; 

    [[CCTextureCache sharedTextureCache] removeTexture:rtxTexture1];
    [[CCTextureCache sharedTextureCache] removeTexture:rtxTexture2];

    [EAGLContext setCurrentContext:nil];
    [self performSelectorOnMainThread:@selector(textureLoaded:) withObject:rtx.sprite.texture waitUntilDone:YES]; 

    [pool release];
}

- (void) textureLoaded:(CCTexture2D*) newTexture {
    [textures addObject:newTexture];
}

- (void) replaceTexture {
    if (rtxSprite != nil) {
        [spriteDisplay removeChild:rtxSprite cleanup:YES];
        [[CCTextureCache sharedTextureCache] removeTexture:[textures objectAtIndex:0]];
        [textures removeObjectAtIndex:0];
    }

    rtxSprite = [CCSprite spriteWithTexture:[textures objectAtIndex:0]];
    rtxSprite.scaleY = -1;
    [spriteDisplay addChild: rtxSprite];
}

Ответы:


1
  1. Попробуйте отладить свой код: добавьте точки останова или NSLog/CCLOG для отслеживания вызовов методов init/dealloc CCTexture2D/CCRenderTexture.

  2. У вас есть потенциальная проблема с CCRenderTexture в фоновом потоке. Когда я пытаюсь использовать CCRenderTexture для управления текстурами, результат был неожиданным (черная текстура или сбой). Это связано с тем, что в основном цикле также вызываются функции OpenGL, а OpenGL является конечным автоматом. Обходной путь заключался в вызове метода с CCRenderTexture в основном потоке (performSelectorOnMainThread).

07.05.2012

2

Вызов [pool release] перед установкой контекста на nil решает проблему.

07.05.2012
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]