0

我有一个在菜单中需要 UIImagePickerController 的 cocos2d 应用程序。在 iPad 上,代码运行流畅,但在 iPhone 上,当 UIImagePickerController 出现在屏幕上时,会出现巨大的性能损失——您需要按住按钮超过 2 秒,然后才能将它们注册为点击。有什么提高响应时间的性能提示吗?在创建 UIImagePickerController 之前,我已经在 CCDirector 上调用了“暂停”和“停止动画”。

- (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

当 CCDirector 视图被 UIKit 视图完全隐藏时,我通过隐藏它来修复性能问题(在我的情况下,仅在 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 回答