gpt4 book ai didi

iphone - CorePlot ScatterPlot 滚动性能 iPhone4

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

我正在使用 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];
}

最佳答案

最好在后台执行绘图。

您可能正试图在主队列上绘制/处理这些图形,这很糟糕。正在发生的是你所有的渲染、处理和你的用户触摸事件都在主队列中备份,如下所示。所以你得到的是绘图、处理和触摸事件按照它们被接收的顺序发生 (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;行加上使 UI 重新呈现自身的任何代码。

查看名为 “在 iOS 上构建并发用户界面”

的 WWDC 2012 视频

关于iphone - CorePlot ScatterPlot 滚动性能 iPhone4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601794/

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