0

メニューに UIImagePickerController を必要とする cocos2d アプリがあります。iPad ではコードはスムーズに実行されますが、iPhone では UIImagePickerController が画面上にあるときにパフォーマンスが大幅に低下します。タップとして登録される前にボタンを 2 秒以上押し続ける必要があります。応答時間を改善するためのパフォーマンスのヒントはありますか? UIImagePickerController を作成する前に、CCDirector で既に「pause」と「stopAnimation」を呼び出しています。

- (void)dismissViewControllerIfRequired {
    if(_viewController != nil) {
        [_viewController removeFromParentViewController];
        _viewController = nil;
    }
}

- (void)dismissPickerIfRequiredAndAnimate:(BOOL)animated {
    if (_picker != nil) {
        [_picker dismissModalViewControllerAnimated:animated];
        [_picker.view removeFromSuperview];
        _picker = nil;

        [[CCDirector sharedDirector] startAnimation];
        [[CCDirector sharedDirector] resume];
    }
}

- (void)dismissPopoverIfRequiredAndAnimate:(BOOL)animated {
    if (_popover != nil) {
        [_popover dismissPopoverAnimated:animated];
        _popover = nil;
    }
}

- (void)showPhotoLibrary {
    [self dismissPickerIfRequiredAndAnimate:NO];
    [self dismissViewControllerIfRequired];
    [self dismissPopoverIfRequiredAndAnimate:NO];

    CCDirector * director = [CCDirector sharedDirector];
    [director pause];
    [director stopAnimation];

    _picker = [[UIImagePickerController alloc] init];
    _picker.delegate = self;
    _picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    _picker.wantsFullScreenLayout = YES;
    _picker.view.userInteractionEnabled = YES;

    if([CCDirector sharedDirector].currentDeviceIsIPad) {
        _popover = [[UIPopoverController alloc] initWithContentViewController:_picker];
        [_popover setDelegate:self];

        CGSize winsize = [[CCDirector sharedDirector] winSize];
        [_popover setPopoverContentSize:CGSizeMake(320, winsize.height) animated:NO];

        CGRect r = CGRectMake(20,20,10,10);
        r.origin = [[CCDirector sharedDirector] convertToGL:r.origin];
        [_popover presentPopoverFromRect:r inView:[CCDirector sharedDirector].view permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO];
    } else {

        _viewController = [[UIViewController alloc] init];
        _viewController.view.userInteractionEnabled = YES;
        [director.view addSubview:_viewController.view];
        [_viewController presentModalViewController:_picker animated:NO];
    }

}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissPickerIfRequiredAndAnimate:YES];
    [self dismissViewControllerIfRequired];
    [self dismissPopoverIfRequiredAndAnimate:YES];
}


- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    [self dismissPickerIfRequiredAndAnimate:YES];
    [self dismissViewControllerIfRequired];
}



- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info {

    UIImage * pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    if(pickedImage == nil) {
        printf("picked image was nil...\n");
    } else {
        printf("picked image size: %f, %f\n", pickedImage.size.width, pickedImage.size.height);
    }

    [self dismissPickerIfRequiredAndAnimate:YES];
    [self dismissPopoverIfRequiredAndAnimate:YES];
}
4

1 に答える 1

0

UIKit ビューによって完全に非表示になっている CCDirector ビューを非表示にすることで、パフォーマンスの問題を修正しました (私の場合は iPhone でのみ必要で、iPad では必要ありません)。このようなもの:

+ (void)hideDirector {
    CCDirector * director = [CCDirector sharedDirector];

    if(!director.view.hidden) {
        [director purgeCachedData]; //optional
        [director pause];
        [director stopAnimation];

        [director.view setHidden:YES];
    }
}


+ (void)showDirector {
    CCDirector * director = [CCDirector sharedDirector];

    if(director.view.hidden) {
        [director.view setHidden:NO];

        [director stopAnimation];
        [director resume];
        [director startAnimation];
    }
}
于 2013-03-06T07:05:56.283 に答える