UIImagePickerController在cocos2d iOS中非常慢



我有一个cocos2d应用程序,需要在菜单中的UIImagePickerController。在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, %fn", pickedImage.size.width, pickedImage.size.height);
    }
    [self dismissPickerIfRequiredAndAnimate:YES];
    [self dismissPopoverIfRequiredAndAnimate:YES];
}

我通过隐藏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];
    }
}

最新更新