gpt4 book ai didi

ios - CorePlot 多个散点图内存消耗巨大

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:31 24 4
gpt4 key购买 nike

我在使用 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 个)绘制到一个图中的正确方法?如果是这样,我可以做些什么来优化我的情节表现?

输出应该是这样的: Expected (scrollable) output

最佳答案

我发现了这个用途

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

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

关于ios - CorePlot 多个散点图内存消耗巨大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22336358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com