CorePlot ScatterPlot滚动性能iPhone4

时间:2012-07-22 16:02:10

标签: iphone ios uikit core-graphics core-plot

我正在使用核心情节绘制图表。到目前为止,它似乎是一个很棒的框架,但是当我启用用户交互并执行滚动时,我遇到了一些性能问题。

起初我认为这是由于绘制点的数量,所以我写了一个简单的测试应用程序,只有很少的点。尽管情节尽可能简单,但滚动仍然很不稳定。我用这个情节在iPhone 4上得到20-25 fps左右。

我做错了什么,或者这与核心情节一样快?

我的示例代码如下:

- (void)viewDidLoad
{
    [super viewDidLoad];

    graph = [(CPTXYGraph *)[CPTXYGraph alloc] initWithFrame:CGRectZero];

    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
    plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length: CPTDecimalFromDouble(5)];
    plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0) length:CPTDecimalFromDouble(5)];
    plotSpace.allowsUserInteraction = YES;
    plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-10) length:CPTDecimalFromDouble(100)];
    plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt(-10) length:CPTDecimalFromDouble(20)];

    // Axes
    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
    CPTXYAxis *x          = axisSet.xAxis;
    x.majorIntervalLength         = CPTDecimalFromInt(1);
    x.orthogonalCoordinateDecimal = CPTDecimalFromInt(0);
    x.axisConstraints = [CPTConstraints constraintWithLowerOffset:30];

    CPTXYAxis *y = axisSet.yAxis;
    y.majorIntervalLength         = CPTDecimalFromInt(1);
    y.minorTicksPerInterval       = 0;
    y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0);
    y.axisConstraints = [CPTConstraints constraintWithLowerOffset:30];

    // Create a plot that uses the data source method
    CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init];
    dataSourceLinePlot.identifier = @"1";

    CPTMutableLineStyle *lineStyle = [dataSourceLinePlot.dataLineStyle mutableCopy];
    lineStyle.lineWidth              = 3.f;
    lineStyle.lineColor              = [CPTColor redColor];
    dataSourceLinePlot.dataLineStyle = lineStyle;
    dataSourceLinePlot.dataSource = self;
    dataSourceLinePlot.delegate = self;
    [graph addPlot:dataSourceLinePlot];

    hostView.hostedGraph = graph;
}

-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot
{
    return 20;
}

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
    return [NSNumber numberWithInt:index];
}

2 个答案:

答案 0 :(得分:1)

如果你在后台进行绘图,那就最好了。

您可能正在尝试在主队列上绘制/处理这些图表,这是不好的。发生的事情是所有渲染,处理和用户触摸事件都在主队列中备份,如下所示。所以你得到的是绘图,处理和触摸事件按它们被接收的顺序(FIFO)发生。如果您将处理放在后台触摸事件将被处理而无需等待。 (请观看下面引用的视频)

BAD (what you are probably doing)
MainQueue: Process/Plot -> TouchEvent(scroll) -> Render -> Plot/Process -> Plot/Process -> TouchEvent(scroll) -> Update UI -> TouchEvent

GOOD
MainQueue: TouchEvent(scroll) -> TouchEvent(scroll) -> Update UI -> TouchEvent
ProcessingQueue: Process/Plot -> Plot/Process -> Plot/Process 

最好让MainQueue只处理渲染(UI更新)和触摸事件,并将其他所有内容放在后台队列中。

NSOperationQueue *q = [NSOperationQueue alloc] init];
[q setName:@"Plotting Queue"];
[q addOperationWithBlock:^{ plotGraph(); }];
[q addOperationWithBlock:^{ 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        updateTheUI();
     }];
}];

plotGraph 方法将是您上面的所有绘图代码。 updateTheUI 方法将是您的hostView.hostedGraph = graph; line以及任何使UI重新呈现的代码。

查看名为“在iOS上构建并发用户界面”的WWDC 2012视频

答案 1 :(得分:0)

在设置轴标签策略之前,我的散点图存在巨大的性能问题。将标签策略设置为自动或无,消除了我有5秒的延迟。

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