Cocos2d смешивается с UIKit-представлениями - огромное падение FPS - PullRequest
2 голосов
/ 21 сентября 2011

У меня есть игра, написанная на Cocos2d. Вдобавок к этому я представляю некоторые объекты UIKit.

Затем я добавил в него UIViewController, который обрабатывает отдельную мини-игру, написанную с использованием объектов UIKit и анимации UIView. Код, который я использую, чтобы добавить это в мою сцену Cocos2D, следующий:

gameVC = [[[UGameViewController alloc] 
                                      initWithNibName:@"UGameViewController" bundle:nil] 
                                     retain];

[[[CCDirector sharedDirector] openGLView] addSubview:gameVC.view];
gameVC.parentClass = self;
[gameVC viewDidAppear:YES];

Инициализация игры uikit происходит в методе viewDidAppear:, поэтому я вызываю его с контроллера.

Когда вид был добавлен таким образом, я заметил, что анимации, которые я там использую (масштабирование + трансляция + перелистывание вида), очень и очень изменчивы. Запуск приложения на моем iPad и просмотр инструментов CoreAnimation показывает резкое падение FPS - с 40-60 кадров в секунду в сценах cocos2d до 4-8 кадров в секунду в части UIKit.

Могу ли я что-нибудь сделать, чтобы это как-то исправить?


Редактировать: моя инициализация CCDirector выглядит так:

- (void) applicationDidFinishLaunching:(UIApplication*)application
{
    window = [[ShakeEnabledUIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Try to use CADisplayLink director
    // if it fails (SDK < 3.1) use the default director
    if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )
        [CCDirector setDirectorType:kCCDirectorTypeDefault];


    CCDirector *director = [CCDirector sharedDirector];

    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    viewController.wantsFullScreenLayout = YES;

    //
    // Create the EAGLView manually
    //  1. Create a RGB565 format. Alternative: RGBA8
    //  2. depth format of 0 bit. Use 16 or 24 bit for 3d effects, like CCPageTurnTransition
    //
    //
    EAGLView *glView = [EAGLView viewWithFrame:[window bounds]
                                   pixelFormat:kEAGLColorFormatRGB565
                                   depthFormat:0                        
                            preserveBackbuffer:NO];

    [director setOpenGLView:glView];

#if GAME_AUTOROTATION == kGameAutorotationUIViewController
    [director setDeviceOrientation:kCCDeviceOrientationPortrait];
#else
    [director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];
#endif

    [director setAnimationInterval:1.0/60];     

    // make the OpenGLView a child of the view controller
    [viewController setView:glView];
    // make the View Controller a child of the main window
    [window addSubview: viewController.view];

    [window makeKeyAndVisible];

    // Default texture format for PNG/BMP/TIFF/JPEG/GIF images
    // It can be RGBA8888, RGBA4444, RGB5_A1, RGB565
    // You can change anytime.
    [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];

    // Run the intro Scene
    [[CCDirector sharedDirector] runWithScene: [Main scene]];       
}

1 Ответ

1 голос
/ 24 октября 2011

Я так понимаю, вы используете CoreAnimation для анимации ваших представлений UIKit. Это может быть проблемой. Cocos2D не оставит много времени на обработку ваших анимаций вида UIKit, если вы не приостановите Cocos2D или не остановите его полностью (CCDirector stopAnimation / startAnimation).

Что вы можете сделать, это использовать CCNode в качестве оболочки для каждого объекта UIKit, который вы используете. CCNode содержит представление UIKit и обновляет свою позицию, чтобы быть синхронизированной с его собственной позицией. Затем вы можете использовать анимационные действия Cocos2D (т.е. MoveTo с замедлением), чтобы анимировать узел и, таким образом, представления UIKit.

...