2

Quartz 2Dで動的に描画された多くの線を平坦化またはマージする方法を理解しようとしています.

私はステージ上で時間をかけてランダムな線を描いています。毎回新しい線の座標を配列に追加し、配列を描画します (drawRect を使用し、タイマーと setNeedDisplay を使用して配列に新しい線をプッシュして、実際にすべてを再描画します)前の行と新しい行)

今問題:しばらくすると、配列が非常に長くなるため、ますます遅くなり始めます。そのため、座標をフラット画像または何かにマージし、配列をクリアしてメモリを健全に保つ必要がありますが、どうすればよいですかこれを行う?

これは私の現在のワークフローです:

  • 通話タイマー

    [NSTimer scheduleTimerWithTimeInterval:0.1 target:self selector:@selector(drawdrawdraw) userInfo:nil repeats:YES];

  • 「drawrawdraw」関数で drawRect をリフレッシュする

    -(void)drawdrawdraw{ [self setNeedsDisplay]; }

  • 私の drawRect

    -(void)drawRect:(CGRect)rect{
        viewContext = UIGraphicsGetCurrentContext();
    
        int count = [mijnArray_r_x count];
    
        float r_x = (float)(random() % 768);
        [mijnArray_r_x insertObject:[NSNumber numberWithFloat:r_x] atIndex:count];
    
        float r_y = (float)(random() % 1004);
        [mijnArray_r_y insertObject:[NSNumber numberWithFloat:r_y] atIndex:count];
    
        float r_w = (float)(random() % 100);
        [mijnArray_r_w insertObject:[NSNumber numberWithFloat:r_w] atIndex:count];
    
        float r_a = (float)(random() % 100);
        [mijnArray_r_a insertObject:[NSNumber numberWithFloat:r_a] atIndex:count];
    
    
        CGContextSetLineWidth(viewContext, 2.0);
        CGContextSetStrokeColorWithColor(viewContext, [UIColor blackColor].CGColor);
        for (int k = 0; k <= count; k++) {
    
            float temp_x = [[mijnArray_r_x objectAtIndex: k] floatValue];
            float temp_y = [[mijnArray_r_y objectAtIndex: k] floatValue];
            float temp_w = [[mijnArray_r_w objectAtIndex: k] floatValue];
            float temp_a = [[mijnArray_r_a objectAtIndex: k] floatValue];
    
            CGPoint pointpointpoint = CGPointMake(temp_x, temp_y);
            CGPoint pointpointpointpoint = CGPointMake(temp_w, temp_a);
            CGContextMoveToPoint(viewContext, pointpointpoint.x, pointpointpoint.y);
            CGContextAddLineToPoint(viewContext, pointpointpoint.x - pointpointpointpoint.x, pointpointpoint.y + pointpointpointpoint.y);
            CGContextStrokePath(viewContext);
        }
    } }
    
4

1 に答える 1

0

UIImageを使用して線を に描画できますUIGraphicsBeginImageContext()。このように、描画に必要な時間は一定になります。これは、各反復で、キャッシュされた画像をビットマップとして描画し、新しい行を追加するだけだからです。

- (void)drawRect:(CGRect)rect {
  [self.currentImage drawInRect:[self bounds]];
  UIGraphicsBeginImageContext([self bounds].size);
  CGContextRef cgContext = UIGraphicsGetCurrentContext();
  //Draw your lines into the cgContext here...
  self.currentImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
}

currentImageこれは、型のプロパティがUIImage宣言されていることを前提としています。

于 2011-01-14T21:13:44.010 に答える