2012-07-22 73 views
3

我正在使用核心繪圖繪製圖形。到目前爲止,它似乎是一個很好的框架,但是當我啓用用戶交互並執行滾動時,我遇到了一些性能問題。CorePlot ScatterPlot滾動性能iPhone4

起初我以爲這是由於被繪製點的數量所以我寫了一個簡單的測試應用程序,只有很少的幾點。儘管情節儘可能簡單,但滾動仍然很不平穩。在這個情節下,我在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]; 
} 

回答

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 =圖;加上任何代碼以使UI重新呈現自己。

退房WWDC 2012的視頻名爲「構建併發用戶界面iOS上的」

+0

當第一次加載圖時,圖委託最初被調用。它不會在每次後續重新加載或用戶交互時調用。當滾動發生時,我相信CorePlot框架所做的唯一事情就是渲染。我並沒有真正做任何背景任務,因爲它是所有渲染相關的,所以我不認爲你的建議適用於此,但如果我錯了,請糾正我。 – Imran 2012-07-23 16:40:48

+0

您可能還需要將圖形移至背景。什麼樣的viewController持有這些陰謀? ScrollView,TableView或? – jdog 2012-07-23 18:15:14

+0

另外你最好打賭是使用時間分析器查看什麼是尖峯。 – jdog 2012-07-23 18:17:00

0

我有巨大的性能問題,我的散點圖,直到我設置軸標籤政策。將標籤策略設置爲「自動」或「無」可消除5秒的滯後時間。

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

不幸的是我需要軸標籤。去除它們會產生輕微的性能改善,但不會太大。 – Imran 2012-08-30 14:27:38