Освобождение памяти Game Center (с Cocos2D) - PullRequest
0 голосов
/ 14 декабря 2011

Мы только что добавили Game Kit в нашу игру Cocos 2D.Работает нормально, но вызывает серьезные утечки памяти.Я прочитал все сообщения об этом на этом форуме (и на других форумах), но ничто, кажется, не помогает.Мы используем GameCenterManager из GKTapper.

Вот как мы создаем таблицу лидеров и показываем ее:

-(void)showLeaderBoard:(NSString *)lb withScore:(int)score
{
GKLeaderboardViewController *leaderboardController = [[[GKLeaderboardViewController alloc] init] autorelease];

if (leaderboardController != nil){
gcVC = [[UIViewController alloc] init];
leaderboardController.category = lb;
leaderboardController.timeScope = GKLeaderboardTimeScopeWeek;
leaderboardController.leaderboardDelegate = self;
[[[CCDirector sharedDirector] openGLView] addSubview: gcVC.view];
[gcVC presentModalViewController:leaderboardController animated:YES];
}

}

И вот она удалена:

- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController
{
[gcVC dismissModalViewControllerAnimated:YES];
[gcVC.view.superview removeFromSuperview];
[gcVC release];
}

Утечка очевидна, если вы посмотрите на использованный Real Mem в мониторе активности.Когда таблица лидеров показывается и отклоняется в первый раз, использование памяти приложением увеличивается на 11,42 МБ, затем оно увеличивается на ~ 0,3 МБ каждый раз, когда таблица лидеров отображается и отклоняется.Кроме того, каждый раз, когда вы просматриваете «Сегодня», «Эта неделя» и «Все время» в таблице лидеров игрового центра, съедается еще ~ 0,2 МБ.

1 Ответ

0 голосов
/ 15 декабря 2011

Я считаю, что код старый и использовался до того, как cocos2d добавил свой собственный RootViewController.Вот код, который я использую в KKGameKitHelper :

-(UIViewController*) getRootViewController
{
    return (UIViewController*)((KKAppDelegate*)[UIApplication sharedApplication].delegate).rootViewController;
}

-(void) presentViewController:(UIViewController*)vc
{
    UIViewController* rootVC = [self getRootViewController];
    [rootVC presentModalViewController:vc animated:YES];
}

-(void) dismissModalViewController
{
    UIViewController* rootVC = [self getRootViewController];
    [rootVC dismissModalViewControllerAnimated:YES];
}

// Leaderboards

-(void) showLeaderboard
{
    if (isGameCenterAvailable == NO)
        return;

    GKLeaderboardViewController* leaderboardVC = [[[GKLeaderboardViewController alloc] init] autorelease];
    if (leaderboardVC != nil)
    {
        leaderboardVC.leaderboardDelegate = self;
        [self presentViewController:leaderboardVC];
    }
}

-(void) leaderboardViewControllerDidFinish:(GKLeaderboardViewController*)viewController
{
    [self dismissModalViewController];
    if ([delegate respondsToSelector:@selector(onLeaderboardViewDismissed)])
    {
        [delegate onLeaderboardViewDismissed];
    }
}
...