我正在使用core plot来绘制图表。到目前为止,它似乎是一个很好的框架,但我在启用用户交互和执行滚动时遇到了一些性能问题。
起初,我认为这是由于绘制的点的数量造成的,所以我编写了一个简单的测试应用程序,其中只有很少的点。尽管故事情节尽可能的简单,滚动仍然是非常不稳定的。通过这个图,我在iPhone 4上得到了大约20-25fps的速度。
我是不是做错了什么,或者这是不是和core plot一样快?
我的示例代码如下:
- (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];
}发布于 2012-07-23 23:47:00
最好是在后台执行绘图。
您可能正在尝试在主队列上绘制/处理这些图形,这是不好的。现在发生的情况是,所有的渲染、处理和用户触摸事件都备份在主队列上,如下所示。因此,您得到的是绘图、处理和触摸事件按照它们被接收的顺序发生(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方法将是上面所有的绘图代码。图形图形方法是您的hostView.hostedGraph =updateTheUI;行加上任何代码,以使UI重新呈现自身。
查看名为《在iOS上构建并发用户界面》的WWDC2012视频
发布于 2012-08-13 00:43:34
在我设置轴标签策略之前,我的散点图存在巨大的性能问题。将标签策略设置为Automatic或None消除了5秒的延迟。
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
CPTXYAxis *x = axisSet.xAxis;
CPTXYAxis *y = axisSet.yAxis;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
y.labelingPolicy = CPTAxisLabelingPolicyNone;https://stackoverflow.com/questions/11601794
复制相似问题