iPad上的iPhone绘图性能不佳,效果很好

时间:2012-01-19 14:45:31

标签: iphone xcode ipad

我的应用有问题。它是为两种设备开发的。在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;

}

2 个答案:

答案 0 :(得分:2)

您可以直接绘制CGImage,而不使用UIImage步骤,使用

剪切几个角
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, self.bounds, cgImage);

这可能会垂直翻转图像,但可以修复。它可能会或可能不会产生影响,我不知道UIImage增加了什么费用。

至于奇怪的性能差异,您可能需要查看底层位图的内存对齐方式。 (请参阅有关offscreenBuffer

的问题的评论

更新有关更新问题中显示的代码

代码效率不高。对于每一次触摸事件,都会发生这种情况:

  1. 致电-drawPoint:
  2. PointLocation的分配,初始化,发布和取消分配,使用setter进行分配(self.point = ...
  3. 致电-drawToBuffer
  4. 在屏幕外环境中设置描边颜色/线条样式/线条上限
  5. beginpath,movetopoint,addlinetopoint,drawpath
  6. 这些可能每个都不会花费很多时间,但如果你要降低复杂性,它们可能会有所不同。每件商品,您可以尝试以下方式:

    1. 通过直接在触摸事件功能中执行某些操作来减少调用次数
    2. 不要在对象中包装CGPoint,而只使用两个CGPoint ivars而不是属性。所以它看起来像:lastPoint = currPoint; currPoint = point;,其余的代码当然适合
    3. 见第1点。
    4. 如果在视图的整个生命周期中保持相同的CGContext支持,则只需在初始化时设置一次。否则,如果您确实需要偶尔切换一次样式,请使用CGContextSaveGState(offscreenBuffer)CGContextRestoreGState(offscreenBuffer)来查看它是否更快
    5. 有一个简洁的功能,只需画一条简单的线:CGContextStrokeLineSegments,这可能会更快。像这样使用它:

      CGPoint points[2] = { lastPoint, currPoint };  CGContextStrokeLineSegments(offscreenBuffer,points,2);

    6. 个人资料/个人资料/个人资料:测试,通过衡量渲染时间来查看更改是否能让事情变得更快。在顶部:NSDate *tstart = [NSDate date];和底部NSLog(@"drawRect took %f ms",-[tstart timeIntervalSinceNow]*1000);

    7. 您可以单独处理这些点,并检查它是否仍然有效。

      祝你好运!

答案 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)];