如何针对低内存优化绘制Core Graphics网格?

时间:2016-06-21 14:29:29

标签: objective-c ipad out-of-memory ios9 core-graphics

在我的应用中,我在自定义视图控制器中绘制网格。它嵌入在滚动视图中,因此在用户放大或缩小(而不是在缩放期间)时,网格会不时重新绘制。

问题是,我正在尝试为iPad Mini这样的低内存设备优化此方法,但它仍在崩溃。如果我完全取消这个绘图,该应用程序工作正常,它没有给我一个崩溃的理由;它告诉我连接丢失了。我可以在我的乐器中看到,在它崩溃之前,内存正在飙升,所以我很确定这是问题所在。

视图是水平和垂直屏幕大小的2.5倍,在创建时以编程方式设置。它有多个CALayers,这个网格绘图发生在其中几个上。当我转向此视图时,或者在我进行缩放后不久,就会立即发生崩溃。

以下是我的绘图方法(为了便于阅读而略微简化,因为它们非常冗余):

#define MARKER_FADE_NONE 0
#define MARKER_FADE_OUT 1 // fades out at widest zoom
#define MARKER_FADE_IN 2 // fades in at widest zoom

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    if (layer == gridSubdividers) [self drawGridInContext:ctx spacing:1 lineWidth:1 markers:NO fade:MARKER_FADE_NONE];
    if (layer == gridDividers) [self drawGridInContext:ctx spacing:5 lineWidth:1 markers:YES fade:MARKER_FADE_OUT];
    if (layer == gridSuperdividers) [self drawGridInContext:ctx spacing:10 lineWidth:2 markers:YES fade:MARKER_FADE_IN];
}

// DRAW GRID LINES
- (void)drawGridInContext:(CGContextRef)context
                  spacing:(float)spacing
                lineWidth:(NSInteger)lineWidth
                  markers:(BOOL)markers
                     fade:(int)fade
{
    spacing = _gridUnits * spacing;

    CGContextSetStrokeColorWithColor(context, [UIColor gridLinesColor]);
    CGContextSetLineWidth(context, lineWidth);
    CGContextSetShouldAntialias(context, NO);

    float top = 0;
    float bottom = _gridSize.height;
    float left = 0;
    float right = _gridSize.width;

    // vertical lines (right of origin)
    CGMutablePathRef path = CGPathCreateMutable();
    for (float i = _origin.x + spacing; i <= _gridSize.width; i = i + spacing) {
        CGPathMoveToPoint(path, NULL, i, top);
        CGPathAddLineToPoint(path, NULL, i, bottom);
    }
    CGContextAddPath(context, path);
    CGContextStrokePath(context);
    CGPathRelease(path);
    }

...然后我重复这个for()循环三次以绘制网格的其他行。我也尝试了这个稍微不同版本的循环,我没有创建单独的路径,而只是在上下文中添加行,然后仅在所有这四个循环的最后进行描述:

for (float i = _origin.x + spacing; i <= _gridSize.width; i = i + spacing) {
        CGContextMoveToPoint(context, i, top);
        CGContextAddLineToPoint(context, i, bottom);
    }
    CGContextStrokePath(context);

我也尝试了两者的组合,我在循环的每个循环中开始并抚摸:

for (float i = _origin.x + spacing; i <= _gridSize.width; i = i + spacing) {
        CGContextBeginPath(context);
        CGContextMoveToPoint(context, i, top);
        CGContextAddLineToPoint(context, i, bottom);
        CGContextStrokePath(context);
    }

那么如何简化整个绘图方法以使其不使用尽可能多的内存?如果它不能一次绘制一条路径,之后释放每条路径,就像我上面显示的第一个循环...我不确定该怎么办除了读取设备上的可用内存并关闭网格绘图功能如果很低。

我也完全接受网格绘图的替代方法。

0 个答案:

没有答案