coreplote实时绘图无法在20ms刷新时间间隔内正常执行

时间:2014-05-26 13:33:16

标签: real-time core-plot

我希望达到XYplot每20ms刷新一次的目标,每个刷新时间增加5个新点,并在graphview中显示5000个点(xRanage = 5000,yRange = 2048)。

在前1000个点中,刷新速度看起来正常,但在1000点之后,每次刷新事件的刷新速度都会变慢。

虽然我使用inertDataAtIndex:numberOfRecords来更新数据可以减少运行numberForPlot:field:recordIndex函数的过程,但我觉得它仍然刷新所有的graphview,而不是逐点绘制。

因此,在1000点之后它仍然缓慢刷新,并且每个输入数据都会降低。

是不是意味着coreplot不适合做快速实时事件?

这是我的代码:

- (IBAction)Refresh:(UIButton *)sender {
    timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self
selector:@selector(show) userInfo:nil repeats:YES];
}

- (void)show {
    for (int i=0; i<5; i++) {
        [dataArray addObject:[NSNumber numberWithInt:arc4random()%801+1000]];
        [dataArray2 addObject:[NSNumber numberWithInt:arc4random()%601+300]];
    }

    //[graph reloadData];
    [plotLine insertDataAtIndex:[dataArray count]-5 numberOfRecords:5];
    [plotLine2 insertDataAtIndex:[dataArray2 count]-5 numberOfRecords:5];
}

- (NSUInteger) numberOfRecordsForPlot:(CPTPlot *)plot {
    return [dataArray count];
}

- (NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx {
    NSNumber *num;

    if (fieldEnum == CPTScatterPlotFieldY) {
        if ([(NSString *)plot.identifier isEqualToString:@"line1"])
            num = [dataArray objectAtIndex:idx];
        else if ([(NSString *)plot.identifier isEqualToString:@"line2"])
            num = [dataArray2 objectAtIndex:idx];
    }else{
        num = [NSNumber numberWithInt:idx];
    }
    return num;
}

1 个答案:

答案 0 :(得分:1)

您使用什么设备来显示此图表? Mac还是iOS?即使是Retina MacBook Pro在屏幕上的像素也不到3000像素,因此您要做的第一件事就是减少绘制的点数。你还有两个独立的情节,这使得一切都需要两倍的时间。

绘图的显示格式(线条样式,区域填充,绘图符号等)也有很大的不同。简化并消除您不需要的元素(将相应的属性设置为nil)。尝试不同的设置并测量结果。

alignsPointsToPixels设置为NO以节省一些时间,使每个绘图点与像素网格对齐。对于快速变化的数据的实时显示,没有人会注意到。