我的应用有问题。它是为两种设备开发的。在iPad上它运行良好,但如果我在iPhone上运行它很糟糕。它减慢了很多。注意:我使用故事板和两个设备的相同View控制器和委托。
有什么建议吗?
Is drawRect ---- leaking memory
iOS 5,iPhone 3,3S,4和4S。每个人都遇到了这个问题。 它根据手指的移动而绘制。 如果我触摸屏幕,我画的线落后.....我不知道为什么。 在iPad上它很棒。
也许但主要可能存在问题
- (void)drawRect:(CGRect)rect
{
CGImageRef cgImage = CGBitmapContextCreateImage(offScreenBuffer);
UIImage *uiImage = [[UIImage alloc] initWithCGImage:cgImage];
CGImageRelease(cgImage);
[uiImage drawInRect:self.bounds];
[uiImage release];
}
从触摸事件中调用此方法......
-(void)drawPoint:(UITouch *)touch {
currentLoc = [[PointLocation alloc] init];
currentLoc.location = [touch locationInView:self];
self.previousPoint = self.point;
self.point = currentLoc;
[self drawToBuffer];
[currentLoc release];
}
这是缓冲......
-(void)drawToBuffer {
CGFloat color[4] = {R,G,B,A};
if (self.previousPoint != nil) {
CGContextSetRGBStrokeColor(offScreenBuffer, color[0],color[1],color[2],color[3]);
CGContextBeginPath(offScreenBuffer);
CGContextSetLineWidth(offScreenBuffer, lane);
CGContextSetLineCap(offScreenBuffer, kCGLineCapRound);
CGContextMoveToPoint(offScreenBuffer, previousPoint.location.x, previousPoint.location.y);
CGContextAddLineToPoint(offScreenBuffer, point.location.x, point.location.y);
CGContextDrawPath(offScreenBuffer, kCGPathStroke);
}
[self setNeedsDisplay];
}
但现在我真的不知道也不知道...... :(
创建offscreenbuffer - (CGContextRef)setupBuffer {
CGSize size = self.bounds.size;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(context, 0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);
return context;
}
答案 0 :(得分:2)
您可以直接绘制CGImage
,而不使用UIImage
步骤,使用
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, self.bounds, cgImage);
这可能会垂直翻转图像,但可以修复。它可能会或可能不会产生影响,我不知道UIImage
增加了什么费用。
至于奇怪的性能差异,您可能需要查看底层位图的内存对齐方式。 (请参阅有关offscreenBuffer
)
更新有关更新问题中显示的代码
代码效率不高。对于每一次触摸事件,都会发生这种情况:
-drawPoint:
PointLocation
的分配,初始化,发布和取消分配,使用setter进行分配(self.point = ...
)-drawToBuffer
这些可能每个都不会花费很多时间,但如果你要降低复杂性,它们可能会有所不同。每件商品,您可以尝试以下方式:
lastPoint = currPoint; currPoint = point;
,其余的代码当然适合CGContextSaveGState(offscreenBuffer)
和CGContextRestoreGState(offscreenBuffer)
来查看它是否更快有一个简洁的功能,只需画一条简单的线:CGContextStrokeLineSegments
,这可能会更快。像这样使用它:
CGPoint points[2] = { lastPoint, currPoint };
CGContextStrokeLineSegments(offscreenBuffer,points,2);
个人资料/个人资料/个人资料:测试,通过衡量渲染时间来查看更改是否能让事情变得更快。在顶部:NSDate *tstart = [NSDate date];
和底部NSLog(@"drawRect took %f ms",-[tstart timeIntervalSinceNow]*1000);
您可以单独处理这些点,并检查它是否仍然有效。
祝你好运!答案 1 :(得分:1)
检查绘图代码以查找任何硬编码值,例如
UIGraphicsBeginImageContext(CGSizeMake(1024, 768));
[drawImage.image drawInRect:CGRectMake(0, 0, 1024, 768)];
然后成功
UIGraphicsBeginImageContext(CGSizeMake(self.frame.size.width,self.frame.size.height));
[drawImage.image drawInRect:CGRectMake(0, 0, self.frame.size.width,self.frame.size.height)];