Я использую класс QuartzImage в одном из демонстрационных проектов, и я пытался добиться простого рамочного дисплея, который в основном рисует изображение (320x480) каждые 1/10 секунды.Так что моя «частота кадров» должна быть 10 кадров в секунду.
В демонстрационном классе QuartzImage есть метод drawInContext, и в этом методе он в основном рисует CGImageRef с использованием CGContextDrawImage (), я измерил время, которое потребовалось для завершения, и занимает в среднем около ~ 200 мс..
2011-03-24 11:12:33.350 QuartzDemo[3159:207] drawInContext took 0.19105 secs
-(void)drawInContext:(CGContextRef)context
{
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
CGRect imageRect;
imageRect.origin = CGPointMake(0.0, 0.0);
imageRect.size = CGSizeMake(320.0f, 480.0f);
CGContextDrawImage(context, imageRect, image);
CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();
NSLog(@"drawInContext took %2.5f secs", end - start);
}
Может кто-нибудь объяснить, почему это занимает так много времени и есть ли какой-либо другой способ улучшить производительность?200 мс кажется гораздо длиннее, чем следовало бы.
ОБНОВЛЕНИЯ Я попробовал предложение Брэда-Ларсона, но не увидел значительного улучшения производительности.
Итак, в обновленной версии у меня есть свой собственный класс
@interface FDisplay : UIView {
CALayer *imgFrame;
NSInteger frameNum;
}
end
Так что в моей реализации класса
- (id)initWithFrame:(CGRect)frame {
............
frameNum = 0;
NSString *file = [NSString stringWithFormat:@"frame%d",frameNum];
UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:file ofType:@"jpg"]];
imgFrame = [CALayer layer];
CGFloat nativeWidth = CGImageGetWidth(img.CGImage);
CGFloat nativeHeight = CGImageGetHeight(img.CGImage);
CGRect startFrame = CGRectMake(0.0, 0.0, nativeWidth, nativeHeight);
imgFrame.contents = (id)img.CGImage;
imgFrame.frame = startFrame;
CALayer *l = [self layer];
[l addSublayer:imgFrame];
}
У меня NSTimer идет в 0.1f, вызывая мое обновлениеmethod
NSString *file = [NSString stringWithFormat:@"frame%d",frameNum];
UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:file ofType:@"jpg"]];
frameNum++;
if (frameNum>100)
frameNum = 0;
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
[imgFrame setContents:(id)img.CGImage];
[CATransaction commit];
end = CFAbsoluteTimeGetCurrent();
NSLog(@"(%d)refresh took %2.5f secs", [[self subviews] count],end - start);
Я думаю, что все правильно, но частота кадров все еще очень низкая,
refresh took 0.15960 secs