2012-05-16 7 views
0

EDIT2: В ответ на ответ ниже я создал другую GameScene для тестирования производительности частоты кадров с 4 спрайтами, анимированными эффектом CCShaky3D. Проблема все еще сохраняется, так как fps все еще около ~ 15 кадров в секунду. Я вставляю код в конце этого вопроса, чтобы облегчить чтение. Мое предположение заключается в том, что я одновременно запускаю более одного CCShaky3D. Кто-нибудь может запускать несколько эффектов CCShaky3D одновременно без снижения частоты кадров?Эффекты Cocos2d замедляют резкость FPS и как правильно инициализировать EAGLView

Я ввел эффекты (cocos2d programming guide) из cocos2d в свою игру и заметил, что FPS резко замедляется. От 60fps до ~ 10fps, как только спрайт, на который я применяю эффект, появляется.

Я впервые представил их в своей игре и имел проблему с черным фоном (как в сообщении so post). Я следовал за решением, и проблема была решена.

В отладчике я заметил, что после четвертого спрайта, к которому я применяю анимацию, приложение получает предупреждение о памяти. Частота кадров падает, как только появляется второй спрайт, к которому я применяю эффект. На сцене у меня уже есть еще 2-3 вражеских спрайта на экране одновременно с игровым спрайтом, и я предполагаю, что это может быть проблемой памяти. Затем я попытался добавить только один спрайт с анимацией, а оставшиеся 2-3 вражеских спрайта все еще существуют, и частота кадров падает «всего» до ~ 45 кадров в секунду.

EDIT: Когда я не применяю эффект к этим спрайтам, частота кадров не изменяется (остается ~ 60 кадров в секунду).

Я предполагаю, что это связано с тем, как я управляю своей памятью, но перед тем, как резко изменить код, который я хотел бы получить по этому поводу. Вам удается запустить сцену, например. 2-3 спрайтов с эффектом и 4-5 других спрайтов (например, врагов и игроков), движущихся вокруг?

Initializing EAGLView правильно:

Как получить эффекты работы мне пришлось изменить EAGLView инициализации я отправляю это здесь, как я думаю, может быть ralated. Я очень не знаком с инициализацией UIViewController и EAGLView, и мне интересно, не делаю ли я что-то не так, и если это может повлиять на частоту кадров.

Я изменил пример ShootEmUp из Learn iPhone and iPad cocos2d chapter 8 source code и заметил, что в пример в AppDelegate нет RootViewController экземпляра. Вместо этого в Coco2d Cookbook RootViewController используется в AppDelegate, а также в любом шаблоне, который я создаю с помощью Cocos2d. В моем коде я изменил макрос CC_DIRECTOR_INIT(), добавив инициализацию EAGLView, как предложено в сообщении 2.

Я нашел это official cocos2d guide, в котором говорится, что нет необходимости создавать UIViewController в приложении cocos2d, которое подтверждает подход в примере ShootEmUp (3). Поскольку я до сих пор не знаком с ролями CCDirector, EAGLView и UIViewController, я бы попросил разъяснить коммьюнити о том, как они взаимодействуют друг с другом, а также если инициализация любого из них может повлиять на частоту кадров. Большое спасибо.

EDIT 2 - Исходный код, который я использовал для тестирования эффекта эффекта CCShaky3D на скорость исполнения кадров в секунду:

// Element.h 
#import <Foundation/Foundation.h> 
#import "cocos2d.h" 

@interface Element : CCSprite { 

} 
+(id) elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:(enum ElementsType)type: (int)time :(NSString*)frameName :(CGPoint) spawnPosition; 
@end 


//Implementation of elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos method.. 
+(id) elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:(enum ElementsType)type: (int)time :(NSString*)frameName :(CGPoint) spawnPosition; 
{ 
    return [[[self alloc] initWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:type :time :frameName :spawnPosition] autorelease]; 
} 

//TestLayer.h 
#import <Foundation/Foundation.h> 
#import "cocos2d.h" 
@interface TestLayer : CCLayer { 

} 
+(CCScene *) scene; 
@end 


//TestLayer.m 

#import "TestLayer.h" 
#import "Element.h" 

@implementation TestLayer 


+(CCScene *) scene 
{ 
    // 'scene' is an autorelease object. 
    CCScene *scene = [CCScene node]; 

    // 'layer' is an autorelease object. 
    TestLayer *layer = [TestLayer node]; 

    // add layer as a child to scene 
    [scene addChild: layer]; 

    // return the scene 
    return scene; 
} 

/on "init" you need to initialize your instance 
-(id) init 
{ 
    // always call "super" init 
    // Apple recommends to re-assign "self" with the "super" return value 
    if((self=[super init])) { 
     CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache]; 
     [frameCache addSpriteFramesWithFile:@"game-art-hd.plist"]; 

     // ask director the the window size 
     CGSize size = [[CCDirector sharedDirector] winSize]; 

     CCSprite *background = [CCSprite spriteWithFile:@"bg1.png"]; 
     background.anchorPoint = CGPointMake(0.5f, 0); 
     background.position = CGPointMake(size.width/2, 0); 
     [self addChild:background]; 

     Element * element = [Element elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:HEARTH :3 :@"star-anim1.png" :CGPointMake(100.0f, 20.0f)]; 
     element.visible=TRUE; 
     id shaky = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5]; 
     [element runAction:shaky ]; 
     [self addChild:element ]; 

     element = [Element elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:HEARTH :3 :@"star-anim1.png" :CGPointMake(140.0f, 20.0f)]; 
     id shaky2 = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5]; 

     element.visible=TRUE; 
     [element runAction:shaky2 ]; 
     [self addChild:element ]; 

     element = [Element elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:HEARTH :3 :@"star-anim1.png" :CGPointMake(240.0f, 20.0f)]; 
     element.visible=TRUE; 
     id shaky3 = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5]; 

     [element runAction:shaky3 ]; 
     [self addChild:element ]; 


     element = [Element elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:HEARTH :3 :@"star-anim1.png" :CGPointMake(340.0f, 20.0f)]; 
     element.visible=TRUE; 
     id shaky4 = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5]; 

     [element runAction:shaky4 ]; 
     [self addChild:element ]; 

    } 
    return self; 
} 

ответ

1

Что FPS вы получили при работе на реальном устройстве? Вы должны знать, что имитатор работает по сравнению с реальными устройствами по значительным факторам. В настоящее время я запускаю приложение с 16+ анимированными спрайтами на сцене боя, при очень приличных частотах кадров на устройствах ... но не более 10 FPS на симуляторе. И да, обратите внимание на это предупреждение о памяти. У вас, вероятно, есть спрайты, которые не получают должным образом освобождением. Для того, чтобы подтвердить это, вы должны добавить эту строку в соответствующем месте в коде:

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]; 
    [[CCDirector sharedDirector] purgeCachedData]; 
    [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]; 

и убедитесь, что у вас есть в кэше текстуры соответствует тому, что вы ожидаете. Если это не так, преследуйте текстуры «сюрпризов» и убедитесь, что они удалены должным образом.

+0

Привет, спасибо. Я попробую добавить команду после обеда :). Тем временем эти фреймворки относятся к реальным данным устройства. Я скоро отправлю сообщение после попытки играть с управлением памятью. Благодаря! – mm24

+0

PS: Анимируйте спрайты, используя эффекты? Кроме того, могу я спросить вас, как вы справляетесь с спрайтами? У вас есть класс EnemyCache с массивом или вы добавляете и удаляете их на место в зависимости от того, когда они должны появиться? PPS: Я пытался использовать ваши команды, и он удаляет данные кэша текстуры, которые мне нужны (например, кадры пули, которые я загрузил в игровой сценах). Мне, вероятно, нужно больше работать над моим управлением памятью, если вы можете подтвердить, что вы можете запускать 3D-эффекты на 16 анимированных спрайтах вашего приложения. – mm24

+0

Я добавил EDIT2 с исходным кодом TestLayer, который я создал, чтобы попробовать проверить наши предположения. Есть доказательства того, что одновременное выполнение CCShaky3D-эффекта на нескольких CCSprite достаточно, чтобы снизить частоту кадров. Если я не пропущу что-то тривиальное в моем тестовом случае. – mm24

1

Я не уверен, что это та же проблема, но после запуска действия CCShaky3D частота кадров снизилась с 60-50 кадров в секунду до 30-20 кадров в секунду.

Мне просто удалось решить задачу создания последовательности действий с CCShaky3D и CCStopGrid. Последний отвечает за восстановление частоты кадров.

+0

Это то, что мне нужно. Благодаря! – Bart