3

コア プロットを使用してグラフを描画しています。これまでのところ、これは優れたフレームワークのようですが、ユーザー インタラクションを有効にしてスクロールを実行すると、いくつかのパフォーマンスの問題が発生しました。

最初は、これはプロットされているポイントの数が原因だと思っていたので、ポイントが非常に少ない簡単なテスト アプリを作成しました。プロットが可能な限り単純であるにもかかわらず、スクロールはまだ非常にぎくしゃくしていました。このプロットでは、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];
}
4

2 に答える 2

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; になります。行に加えて、UI 自体を再レンダリングするためのコードを追加します。

「Building Concurrent User Interfaces on iOS」という WWDC 2012 のビデオをご覧ください。

于 2012-07-23T15:47:00.233 に答える
0

軸のラベル付けポリシーを設定するまで、散布図に大きなパフォーマンスの問題がありました。ラベル付けポリシーを [自動] または [なし] に設定すると、発生していた 5 秒のラグが解消されました。

CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
CPTXYAxis *x = axisSet.xAxis;
CPTXYAxis *y = axisSet.yAxis;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
y.labelingPolicy = CPTAxisLabelingPolicyNone;
于 2012-08-12T16:43:34.153 に答える