我正在制作涉及绘图线的多人游戏。 我有10种不同的自定义UIView,其中使用Core Graphics以独特的颜色绘制了一条线。 所有视图彼此堆叠,并且是半透明的。 之所以在相应的UIView中绘制每种颜色而不是一种颜色,是因为我想让用户能够清除特定的视图。 但是,如果我同时绘制所有这些视图,则会发生大量的滞后。 如果我检查时间分析器,则大部分时间都花在绘图上。 但这并没有那么糟糕,也不会造成太大的滞后。 因此,有什么方法可以让我绘制多个UIView(或其他),而不会引起这种滞后。 是我的代码导致了这种滞后,还是UIView?

- (void)drawRect:(CGRect)rect {
//create a image reference from the bitmap and then draw it in the context of the UIView. 

CGContextRef context = UIGraphicsGetCurrentContext();

CGImageRef cacheImage = CGBitmapContextCreateImage(cacheContext);

  CGContextDrawImage(context, self.bounds, cacheImage);
   CGImageRelease(cacheImage);
}

-(void)draw{
 //drawing code. Could ignore the Beizer curve algorithm here.

 CGContextSetStrokeColorWithColor(cacheContext, [color CGColor]);
 CGContextSetFillColorWithColor(cacheContext, [[UIColor blueColor] CGColor]);

 CGContextSetLineCap(cacheContext, kCGLineCapButt);
 CGContextSetLineWidth(cacheContext, 6+thickness);

        point0 = point1;
        point1 = point2; // previous previous point
        point2 = pos; // previous touch point
        point3 = currentpos;

        double x0 = (point0.x > -1) ? point0.x : point1.x; //after 4 touches we should have a back anchor point, if not, use the current anchor point
        double y0 = (point0.y > -1) ? point0.y : point1.y; //after 4 touches we should have a back anchor point, if not, use the current anchor point
        double x1 = point1.x;
        double  y1 =  point1.y;
        double x2 =  point2.x;
        double  y2 =  point2.y;
        double  x3 = point3.x;
        double  y3 = point3.y;



    // Assume we need to calculate the control
    // points between (x1,y1) and (x2,y2).
    // Then x0,y0 - the previous vertex,
    //      x3,y3 - the next one.

    double xc1 = (x0 + x1) / 2.0;
    double yc1 = (y0 + y1) / 2.0;
    double xc2 = (x1 + x2) / 2.0;
    double yc2 = (y1 + y2) / 2.0;
    double xc3 = (x2 + x3) / 2.0;
    double yc3 = (y2 + y3) / 2.0;

    double len1 = sqrt((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0));
    double len2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));
    double len3 = sqrt((x3-x2) * (x3-x2) + (y3-y2) * (y3-y2));

    double k1 = len1 / (len1 + len2);
    double k2 = len2 / (len2 + len3);

    double xm1 = xc1 + (xc2 - xc1) * k1;
    double ym1 = yc1 + (yc2 - yc1) * k1;

    double xm2 = xc2 + (xc3 - xc2) * k2;
    double ym2 = yc2 + (yc3 - yc2) * k2;
    double smooth_value = 0.8;
    // Resulting control points. Here smooth_value is mentioned
    // above coefficient K whose value should be in range [0...1].
    float ctrl1_x = xm1 + (xc2 - xm1) * smooth_value + x1 - xm1;
    float ctrl1_y = ym1 + (yc2 - ym1) * smooth_value + y1 - ym1;

    float ctrl2_x = xm2 + (xc2 - xm2) * smooth_value + x2 - xm2;
    float ctrl2_y = ym2 + (yc2 - ym2) * smooth_value + y2 - ym2;



        CGContextMoveToPoint(cacheContext, point1.x, point1.y);
        CGContextAddCurveToPoint(cacheContext, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, point2.x, point2.y);
        CGContextStrokePath(cacheContext);




    CGRect dirtyPoint1 = CGRectMake(point1.x-(8+thickness)/2, point1.y-(8+thickness)/2, (8+thickness), (8+thickness));
    CGRect dirtyPoint2 = CGRectMake(point2.x-(8+thickness)/2, point2.y-(8+thickness)/2, (8+thickness), (8+thickness));

    [self setNeedsDisplayInRect:CGRectUnion(dirtyPoint1, dirtyPoint2)];

}

  ask by Freddy translate from so

本文未有回复,本站智能推荐:

2回复

iOS:在UIView中绘制阴影

我找到了一些很棒的代码,它是UIView的子类,它用阴影绘制该视图。 然后,我可以在要放置阴影的任何地方使用该视图: 使用以下内容创建: 问题是,阴影是从右向左绘制的,我该如何反转并从左向右绘制呢?
2回复

如何创建径向UIView?

我试图找出如何创建一个具有'View 2'形状的UIView(见图)。 我只能绘制一条符合形状的单线贝塞尔曲线,但我无法弄清楚如何使视图本身成为这种形状...... 任何人都可以指出我正确的方向或提供一些示例代码? 一旦我创建了这个视图。 我将寻找它遵循另一个相同形状的贝塞
2回复

iPhone iOS如何在原处翻转/反射任何UIView?

我知道如何通过在其范围内重新绘制UIImage来翻转/反射/旋转UIImage。 但是,如何为任何UIView创建“翻转/反射”效果,最好使其中心保持在与以前相同的位置? 谢谢!
1回复

iPhone iOS是否可以渲染弯曲的UIView? [重复]

可能重复: 显示弯曲的文字 我有一个带有UILabel的UIView。 如何使用renderInContext和其他图形操作使UIView看起来是弯曲的,如下例所示?
2回复

iOS 7上UIView的调试和发布模式之间的差异

我有这个代码 它在'Debug'上给我这个: 这个'发布': 而且我不知道如何开始调试这个。 任何人都可以帮我解决这个问题或给我尝试调试的想法吗?
1回复

用静态方法在UIView(切孔)上绘制清晰的颜色

我有一个iPhone应用程序,我需要实现以下方法: 此方法必须从UITextView剪切(填充[UIColor clearColor] )rect r并返回UITextView对象。 用户将从切割孔中看到UITextView背后的视图。 怎么做到呢?
2回复

在iOS中查看阴影

我已经实现了这样的观点- 但我希望视图的底部看起来像这样- 添加阴影maskToBounds = YES ,因为一旦我执行maskToBounds = YES ,我就会得到第一张图片中的内容。 这是我到目前为止的代码
2回复

在Superview中隐藏视图的路径以显示SuperSupervView

我试图弄清楚如何根据其子视图的路径来掩盖视图的路径以揭示基础视图。 我不确定我能否清楚地阐明我想做的事情,所以我画了一张照片: 为了进一步阐明和引导点回家-视图3是视图2的子视图。视图2是视图1的子视图。视图3具有清晰的背景,可显示视图1。 我希望能够基于视图2的子视图动态遮罩此