ACEDrawingView 的绘图问题

Posted

技术标签:

【中文标题】ACEDrawingView 的绘图问题【英文标题】:Drawing Issue with ACEDrawingView 【发布时间】:2013-12-31 10:43:35 【问题描述】:

我想使用ACEDrawing 实现快进功能。我正在做的是,当用户当时正在绘制任何绘图时,我会记录所有用于绘制线条的点。因此,在用户完成其绘图后,我将拥有使用绘图线的所有点。所以我想开发快进功能,用户可以点击一个按钮来查看最终的图纸。我已经实现了如下所示的代码。它适用于 2000 点的小型绘图。但是当点数增加到 1000000 及以上时,它就崩溃了。我不知道它是如何处理这个的。有小伙伴可以给点建议吗?

代码:

    self.currentTool = ACEDrawingToolTypePen;
    self.currentTool.lineWidth = self.lineWidth;
    self.currentTool.lineColor = [UIColor blackColor];
    self.currentTool.lineAlpha = 1;
    [self.currentTool setInitialPoint:currentPoint];
    [self.pathArray addObject:self.currentTool];
    currentPointArray = [mainDictionary objectForKey:@"points"];
    for (int j = 2; j<[currentPointArray count]; j++) 

         currentPoint = CGPointMake([[[currentPointArray objectAtIndex:j] objectForKey:@"x"] floatValue]*widMul, [[[currentPointArray objectAtIndex:j] objectForKey:@"y"] floatValue]*heiMul);

         previousPoint2 = CGPointMake([[[currentPointArray objectAtIndex:j-2] objectForKey:@"x"] floatValue]*widMul, [[[currentPointArray objectAtIndex:j-2] objectForKey:@"y"] floatValue]*heiMul);
         previousPoint1 = CGPointMake([[[currentPointArray objectAtIndex:j-1] objectForKey:@"x"] floatValue]*widMul, [[[currentPointArray objectAtIndex:j-1] objectForKey:@"y"] floatValue]*heiMul);
         if ([self.currentTool isKindOfClass:[ACEDrawingPenTool class]]) 

              CGRect bounds = [(ACEDrawingPenTool*)self.currentTool addPathPreviousPreviousPoint:previousPoint2 withPreviousPoint:previousPoint1 withCurrentPoint:currentPoint];
              CGRect drawBox = bounds;
              drawBox.origin.x -= self.lineWidth * 1.0;
              drawBox.size.width += self.lineWidth * 2.0;
              drawBox.size.height += self.lineWidth * 2.0;
              [self setNeedsDisplayInRect:drawBox];
        
        [self updateCacheImage:NO];

【问题讨论】:

我不想对此投赞成票,我真的坚持这个..需要认真的帮助。 您知道,即使只有一个 CGPoint,数据结构也会在 64 位设备上消耗 16 兆字节的内存?如果您存储 3 个点加上任何其他数据(例如 NSValue 中的装箱点或包含该点的类的实例),则内存使用量可能会高几个因素。如果它崩溃,请告诉我们崩溃是什么(错误消息、控制台日志)并检查您是否在不久前收到任何内存警告。 是的,我正在崩溃并显示消息:因内存压力而终止。 少抽点,一百万多不少。并优化您存储的点的内存使用,即使用 int16_t 数据类型制作自定义点结构 我的代码在较小的点上工作得很好,但它只会导致更多的点出现问题...n 我对 int16_t 数据类型有点了解,我会尝试使用它。 【参考方案1】:

您似乎遇到了内存问题。

您可以按如下方式更改您的代码。 在您的updateCacheImage 方法中,您需要将您的imageContext 放入AutoReleaspool 以释放您的内存。

@autoreleasepool 

    // init a context
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);

    //End Context
    UIGraphicsEndImageContext();

您还必须将对象设置为 nil 以释放内存,如下所示:

id object;
object = nil;

【讨论】:

以上是关于ACEDrawingView 的绘图问题的主要内容,如果未能解决你的问题,请参考以下文章

转 实现类似QQ的窗体停靠

仅绘制 1/4 的牛顿分形

ajax上传文件

OnChange 不适用于单选按钮 [重复]

二维码的生成

c# Winform PropertyGrid 实现下拉框 多选