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 的绘图问题的主要内容,如果未能解决你的问题,请参考以下文章