Проблема производительности Cocos2d на простом коде - PullRequest
0 голосов
/ 30 марта 2012

Я пишу игру на основе плиток, и моя частота кадров упала с 60 до 30 после того, как я загрузил текстуры плиток и строительные текстуры на экран. После нескольких дней поиска и поиска различных решений я все еще не могу выяснить причину.

Чтобы изолировать и понять проблему. Я создал простой проект, который отображает 100 спрайтов в произвольном положении при загрузке программы и после этого ничего не делает в слое HellowWorld:

// on "init" you need to initialize your instance
-(id) init
{
if( (self=[super init])) {

    CCTexture2D *vlo_Texture = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:@"Icon-72.png"]];

    CCSprite *vlo_Temp[100];
    NSInteger vli_X, vli_Y;
    for (NSInteger vli_Counter=0; vli_Counter<100; vli_Counter++)
    {
        vli_X = arc4random()%480;
        vli_Y = arc4random()%320;
        vlo_Temp[vli_Counter] = [CCSprite spriteWithTexture:vlo_Texture]; //[CCSprite spriteWithFile:@"Icon-72.png"];
        vlo_Temp[vli_Counter].position = ccp(vli_X, vli_Y);
        [self addChild:vlo_Temp[vli_Counter]];
    }

}
return self;
}

Тот факт, что код выше работает только со скоростью 30 кадров в секунду, шокирует меня. У меня нет таймера для обновления этих спрайтов. Я считаю, что система должна просто рисовать все спрайты и ничего не делать (я полагаю?)

Я пытался подать заявку:

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444];

и

if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )
    [CCDirector setDirectorType:kCCDirectorTypeMainLoop];

однако они вообще не улучшают производительность. Есть ли что-нибудь еще, что я могу сделать?

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

Alex

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Вы говорите:

После нескольких дней поисков и поиска различных решений ...

но что вы пробовали?


Попробуйте поместить все свои спрайты, которые используют одну и ту же текстуру, в CCSpriteBatchNode.Это позволяет отображать эти спрайты всего одним вызовом glBindTexture, который выполняется довольно медленно.

CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:@"Icon-72.png"];
for (NSInteger vli_Counter=0; vli_Counter<100; vli_Counter++)
    {
        vli_X = arc4random()%480;
        vli_Y = arc4random()%320;
        vlo_Temp[vli_Counter] = [CCSprite spriteWithTexture:vlo_Texture]; //[CCSprite spriteWithFile:@"Icon-72.png"];
        vlo_Temp[vli_Counter].position = ccp(vli_X, vli_Y);
        [batchNode addChild:vlo_Temp[vli_Counter]];
    }

[self addChild batchNode];
0 голосов
/ 02 апреля 2012

Чтобы сравнить время, необходимое для запуска двух разных блоков кода, я рекомендую использовать BNRTimeBlock , как описано в в этом блоге Big Nerd Racn .

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

Когда дело доходит до производительности ... вы пробовали запустить на устройстве?симулятор очень сильно отстает от фактической производительности iSomething, особенно при работе с HD-фотографиями и многочисленными спрайтами.

...