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;
}
Привет, спасибо. Я попробую добавить команду после обеда :). Тем временем эти фреймворки относятся к реальным данным устройства. Я скоро отправлю сообщение после попытки играть с управлением памятью. Благодаря! – mm24
PS: Анимируйте спрайты, используя эффекты? Кроме того, могу я спросить вас, как вы справляетесь с спрайтами? У вас есть класс EnemyCache с массивом или вы добавляете и удаляете их на место в зависимости от того, когда они должны появиться? PPS: Я пытался использовать ваши команды, и он удаляет данные кэша текстуры, которые мне нужны (например, кадры пули, которые я загрузил в игровой сценах). Мне, вероятно, нужно больше работать над моим управлением памятью, если вы можете подтвердить, что вы можете запускать 3D-эффекты на 16 анимированных спрайтах вашего приложения. – mm24
Я добавил EDIT2 с исходным кодом TestLayer, который я создал, чтобы попробовать проверить наши предположения. Есть доказательства того, что одновременное выполнение CCShaky3D-эффекта на нескольких CCSprite достаточно, чтобы снизить частоту кадров. Если я не пропущу что-то тривиальное в моем тестовом случае. – mm24