我遇到了一个非常有趣的例子,我很想复制它。有一个我非常喜欢的很棒的应用程序: https ://itunes.apple.com/en/app/oldbooth/id298007500?mt=8
我不是广告,因为我不是作者。现在他们有一个有趣的点,当从一个表格视图中,通过选择一个拇指,一个带有视频会话的 ViewController 被加载。我注意到了什么:
1)视频会话屏幕的加载速度非常快,几乎没有等待。
2) 不存在 UIImagePicker 快门动画
3)VC外观动画看起来像“pushVC”,我的意思是它是水平的
4)带有预览的视图首先是白色的,然后带有 alpha 动画它变为 0 alpha。
我有一些使用 AVFoundation 视频捕获的经验,但它没有那么快!这对我来说太不可思议了,我看到这种速度水平是可能的,当然我也想要同样的速度。请你建议如何才能达到这种水平的性能?
我正在尝试以下操作:
在父 VC 中,在 didLoad 中:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
self.photoVC = [storyboard instantiateViewControllerWithIdentifier:@"PhotoCreationVC"];
dispatch_async(queue, ^{
[self.photoVC configureFoundation];
});
该方法执行以下操作:
-(void) configureFoundation{
NSError * error;
_captureManager = [[AVCamDemoCaptureManager alloc] init];
if ([_captureManager setupSessionWithPreset:AVCaptureSessionPresetHigh error:&error]) {
[self setCaptureManager:_captureManager];
_sessionEstablished = YES;
} else {
[Utils showMessage:[error localizedDescription] withTitle:@"Input Device Init Failed"];
}
}
当 VC 运行 didLoad 时:
- (void)viewDidLoad
{
[super viewDidLoad];
if (_sessionEstablished) {
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[_captureManager session]];
UIView *view = self.previewView;
CALayer *viewLayer = view.layer;
CGRect bounds = view.bounds;
[captureVideoPreviewLayer setFrame:bounds];
if ([captureVideoPreviewLayer isOrientationSupported]) {
[captureVideoPreviewLayer setOrientation:AVCaptureVideoOrientationPortrait];
}
[captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
self.captureVideoPreviewLayer = captureVideoPreviewLayer;
if ([[_captureManager session] isRunning]) {
[_captureManager setDelegate:self];
NSUInteger cameraCount = [_captureManager cameraCount];
if (cameraCount < 1) {
} else if (cameraCount < 2) {
}
if (cameraCount < 1) {
}
[viewLayer insertSublayer:captureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];
} else {
[Utils showMessage:@"Failed to start session." withTitle:@"Error"];
}
}
}
那么会发生什么:在 iTunes 应用程序中,它首先加载屏幕,然后释放白色视图的 alpha(我猜它只是封面视图,延迟后开始丢失 alfa)。就我而言,它在加载 VC 之前仍然需要考虑一段时间。时间(1.5秒)是一样的,但是等待不是那么友好。
如果我将所有加载代码放在 didAppear 中,它会立即加载,但是加载,所以点击和准备视频之间的总时间增加到 2.5 秒,这不好。
如果我将加载代码放在 willAppear 中,它的工作方式与第一种情况相同,当它首先想到时,加载(总共 1.5 秒)......
PS 我使用来自 Apple 的 AVCamDemoCaptureManager 示例代码,经过简化,没有任何音频和电影输出。只是视频输入设备和静止图像捕获。
伙计们,请给我一些性能建议吗?如何在加载相机会话时实现一些高性能?任何帮助将不胜感激!