Iphone 高效的图形存储方法?

Iphone 高效的图形存储方法?,iphone,objective-c,drawing,cgcontext,Iphone,Objective C,Drawing,Cgcontext,我正在开发一个基本的绘图应用程序,它有几个类。其中一个是“Line”类,它在用户可以绘制的线条上存储一些信息。当用户在屏幕上拖动时,会为其手指的每次移动创建一条线,因此会在其手指后面绘制一条线。我将所有线条对象存储在NSArray中,并在每次发生变化时重新绘制。但是,由于阵列不断变大,最终开始变慢。有没有什么方法可以仅仅画出新的线,或者为这些线提供更好的存储机制 编辑: 阅读下面的答案,但是setNeedsDisplayInRect:似乎不起作用。我这样称呼它: -(void)touchesMo

我正在开发一个基本的绘图应用程序,它有几个类。其中一个是“Line”类,它在用户可以绘制的线条上存储一些信息。当用户在屏幕上拖动时,会为其手指的每次移动创建一条线,因此会在其手指后面绘制一条线。我将所有线条对象存储在NSArray中,并在每次发生变化时重新绘制。但是,由于阵列不断变大,最终开始变慢。有没有什么方法可以仅仅画出新的线,或者为这些线提供更好的存储机制

编辑: 阅读下面的答案,但是
setNeedsDisplayInRect:
似乎不起作用。我这样称呼它:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *t in touches) {
        //add line to array w/ x and y values from touch
        [self setNeedsDisplayInRect:[self rectForLine:line]];
    }
}

-(CGRect)rectForLine:(Line*)line {
    CGFloat x1 = [line begin].x;
    CGFloat y1 = [line begin].y;
    CGFloat x2 = [line end].x;
    CGFloat y2 = [line end].y;
    CGFloat originX = (x1>x2) ? x1 : x2;
    CGFloat originY = (y1<y2) ? y1 : y2;
    CGFloat diffX = ((x1>x2) ? x1 : x2) - originX;
    CGFloat diffY = ((y1>x2) ? y1 : y2) - originY;
    return CGRectMake(originX, originY, diffX, diffY);
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 10.0);
    CGContextSetLineCap(context, kCGLineCapRound);
    //[[UIColor blackColor] set];
    for (Line *line in completeLines) {
        if (CGRectContainsPoint(rect, [line begin]) && CGRectContainsPoint(rect, [line end])) {
            //draw line onto the screen
        }
    }
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件{
适用于(UITouch*t in触控){
//通过触摸将线添加到阵列w/x和y值
[self-setNeedsDisplayInRect:[self-rectForLine:line]];
}
}
-(CGRect)rectForLine:(行*)行{
CGFloat x1=[行开始].x;
CGFloat y1=[行开始].y;
CGX2=[line end].x;
CGY2=[line end].y;
CGFloat originX=(x1>x2)?x1:x2;
CGFloat originY=(y1x2)?x1:x2)-originX;
CGFloat diffY=((y1>x2)?y1:y2)-原始;
返回CGRectMake(originX,originY,diffX,diffY);
}
-(void)drawRect:(CGRect)rect{
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextSetLineWidth(上下文,10.0);
CGContextSetLineCap(上下文,kCGLineCapRound);
//[[UIColor blackColor]set];
用于(行*完整行中的行){
if(CGRectContainsPoint(rect,[line begin])&&CGRectContainsPoint(rect,[line end])){
//在屏幕上画线
}
}
如果一条“线”只是数据模型中的一对点,那就不是让你慢下来的部分

您的性能问题是,您正在重新绘制添加的每一行的整个内容,这是O(n^2)或非常明确的a


假设您在UIView的
-drawRect:
中绘制,最简单的改进可能是仅使包含新行的rect无效并重新绘制。根据起点和终点,您可以创建无效的rect以发送到
-setNeedsDisplayInRect:
,然后在您的drawRect中查看所有的行,然后在d仅绘制矩形内的图形。这会将绘制性能限制在线条的大小上,并且在较小的程度上,绘制“已经存在”的图形。

请定义“似乎不起作用”。您的实现至少有几个问题,但请先告诉我您看到了什么,以便我们知道从何处开始。在我调用
setNeedsDisplay
之前,不会绘制任何内容。如果去掉这些内容,则不会绘制任何内容。1.您的无效矩形看起来是否合理?是否调用了drawRect?2.您的rectForLine至少有一个ob在diffY计算中,明显的输入错误,没有对算法的其余部分进行评论。3.你对一行是否在一个矩形中的测试是错误的——你需要检查一行是否也通过一个矩形,而不仅仅是它是否以一个矩形开始或结束。4.如果你有10px宽的行,你需要填充无效矩形的外部以考虑这一点t、 修正了1、2和4,但我不确定如何解决3。你能帮忙吗?获取直线的边界框(你知道怎么做),并使用CGRectIntersectsRect计算它与draw rect的交点。如果它相交,你需要绘制它。