Cocos2d与UIKit视图混合 - 巨大的FPS下降

时间:2011-09-21 09:17:24

标签: iphone ios cocos2d-iphone core-animation

我有一个用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 intruments让我看到了一个惊人的FPS下降 - 从cocos2d场景中的40-60 fps到UIKit部分上的4-8 fps。

为了以某种方式修复它,我能做些什么吗?


编辑:我的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 个答案:

答案 0 :(得分:1)

我认为你正在使用CoreAnimation来动画你的UIKit视图。这可能是问题所在。 Cocos2D不会为你的UIKit视图动画留下太多的处理时间,除非你暂停Cocos2D或完全停止它(CCDirector stopAnimation / startAnimation)。

您可以使用CCNode作为您正在使用的每个UIKit对象的包装器。 CCNode包含UIKit视图并更新其位置以与其自身位置同步。然后,您可以使用Cocos2D动画操作(即MoveTo with easing)为节点设置动画,从而为UIKit视图设置动画。