【问题标题】:CorePlot multiple scatterplots huge memory consumptionCorePlot 多个散点图 巨大的内存消耗
【发布时间】:2014-04-15 16:37:14
【问题描述】:

我在使用 CorePlot 时遇到了一些问题。我尝试将多个散点图绘制到一个图中。可以按预期工作,但是当我开始滚动或缩放图形时,整个应用程序的内存使用量会增加至 900MB,然后崩溃。我想我必须做一些对象释放,但我不知道如何。基本上我用不同的绘图标识符绘制每条线,并将相应的数据放入数据源中。

这是我得到的:(在此示例代码中,我只是用静态值缩小了 ax 范围以进行测试。)

- (void)setupGraph {
// Create graph from theme
self.graph = [[CPTXYGraph alloc] initWithFrame:self.scatterPlotView.bounds];
self.graph.plotAreaFrame.masksToBorder = NO;
self.scatterPlotView.hostedGraph = self.graph;

CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainBlackTheme];
[self.graph applyTheme:theme];

self.graph.paddingLeft   = 0.0;
self.graph.paddingTop    = 0.0;
self.graph.paddingRight  = 0.0;
self.graph.paddingBottom = 0.0;


// Setup plot space
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace;

plotSpace.allowsUserInteraction = YES;

plotSpace.delegate = self;

plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length:CPTDecimalFromDouble(30)];
plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length:CPTDecimalFromDouble(15)];

plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length:CPTDecimalFromDouble(10)];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length:CPTDecimalFromDouble(15)];

CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.graph.axisSet;
CPTXYAxis *x = axisSet.xAxis;
CPTXYAxis *y = axisSet.yAxis;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
y.labelingPolicy = CPTAxisLabelingPolicyNone;
}

此方法加载我的数据并绘制散点图

- (void)loadSignals {


//Data loading logic goes here nothing special just one array for each plot

for (Signal *sig in [signals allValues]) {
    [self constructScatterPlot:sig.name];
}
}];

这是绘图发生的地方:

- (void)constructScatterPlot:(NSString *)identifier {    
    CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init];

   CPTMutableLineStyle *lineStyle = [dataSourceLinePlot.dataLineStyle mutableCopy];

    CPTScatterPlot *boundLinePlot = [[CPTScatterPlot alloc] init];
    boundLinePlot.identifier = identifier;

    lineStyle            = [boundLinePlot.dataLineStyle mutableCopy];
    lineStyle.miterLimit = 1.0;
    lineStyle.lineWidth  = 1.0;
    lineStyle.lineColor  = [CPTColor redColor];
    boundLinePlot.dataLineStyle = lineStyle;

    boundLinePlot.dataSource     = self;
    boundLinePlot.cachePrecision = CPTPlotCachePrecisionDouble;
    boundLinePlot.interpolation  = CPTScatterPlotInterpolationStepped;
    [self.graph addPlot:boundLinePlot];
}

...这是数据源获取其值的地方:

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
NSString *plotIdent = (NSString *) plot.identifier;

     if (![plotIdent isEqualToString:self.currentIdent]) {
        self.countPlot++;
        self.currentIdent = plotIdent;
    }

Signal *newSig = [self.signals objectForKey:plotIdent];
    Value * newValue = [newSig valueAtTime:index];
NSNumber *number = [NSNumber numberWithInteger:[newValue.value integerValue]];

    if ( fieldEnum == CPTScatterPlotFieldY ) {

        return number;
    }
    if ( fieldEnum == CPTScatterPlotFieldX ) {
        return [NSNumber numberWithInteger:index];
    }
    return nil;
}

首先我想知道这是否是将多个图(在我的情况下最多 40 个)绘制到一个图中的正确方法?如果是这样,我可以做些什么来优化我的情节表现?

输出应如下所示:

【问题讨论】:

  • 你用 countPlot 做什么?每次 Core Plot 需要一对绘图点坐标时都会调用 numberForPlot,因此 countPlot 会随着您的移动或缩放而变大。
  • 我的 countPlot 变量仅在绘制新图(标识符)时增加。此变量用于确定各行的 y 偏移量。

标签: ios objective-c ipad memory core-plot


【解决方案1】:

我发现了这个用途

“尝试在托管视图上将 collapsesLayers 设置为 YES”

Application get stuck when drawing nearly 40 Scatter Plots using Core Plot in IPad

【讨论】:

  • 这实际上对我帮助很大。使用此设置并拥有 40 多个实时散点图,在显示图形视图时,我的应用程序的平均内存使用量从 400 Mb 以上变为 35Mb。
  • 我需要这个答案....谢谢!
【解决方案2】:

每个绘图都是一个CALayer,它覆盖了整个绘图区域,因此使用其中的 40 个可能会耗尽大部分可用的视频内存。如果它们都使用相同的线型,您可以在同一个图上绘制所有线并以这种方式节省一些内存。在线段之间插入一个额外的数据点,并从数据源返回nil@(NAN) 以断开线。

【讨论】:

  • 我不太明白 Eric 的信息。你有任何更新丹尼尔?我的情节可能会相互交叉,所以如果我理解得足够好,额外的数据点不是解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2016-04-29
  • 2018-07-03
  • 2020-11-18
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多