Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CorePlot CPU问题。实时向图形添加数据_Ios_Core Plot - Fatal编程技术网

Ios CorePlot CPU问题。实时向图形添加数据

Ios CorePlot CPU问题。实时向图形添加数据,ios,core-plot,Ios,Core Plot,我将按照CorePlot中的示例在获取新点时向散点图添加新点。我根据CoreData附带的RealTimePlot示例对图形进行建模。我注意到,当我运行我的图形时,一旦屏幕开始滚动以呈现新数据,CPU将固定到100%。我尝试了不同的方法将数据添加到我的数据源以及更新调用中,但我无法获得响应速度快且CPU负载可接受的任何结果 经过多次尝试和错误,我启动了RealTimePlot示例,查看CPU负载是多少,它也固定在100%。这是在iphone5s上的,所以我很害怕看到4的表现。我的问题;是否有其他

我将按照CorePlot中的示例在获取新点时向散点图添加新点。我根据CoreData附带的RealTimePlot示例对图形进行建模。我注意到,当我运行我的图形时,一旦屏幕开始滚动以呈现新数据,CPU将固定到100%。我尝试了不同的方法将数据添加到我的数据源以及更新调用中,但我无法获得响应速度快且CPU负载可接受的任何结果

经过多次尝试和错误,我启动了RealTimePlot示例,查看CPU负载是多少,它也固定在100%。这是在iphone5s上的,所以我很害怕看到4的表现。我的问题;是否有其他方法更新图表

无论如何,这是我的更新循环。我正在获取加速度计数据并绘制图表

-(void)motionController:(VWWMotionController*)sender didUpdateAcceleremeters:(CMAccelerometerData*)accelerometers{
    static NSInteger counter = 0;

    CPTGraph *theGraph = self.graph;
    CPTPlot *thePlot   = [theGraph plotWithIdentifier:@"Blue Plot"];

    if ( thePlot ) {

        if ( self.dataForPlot.count >= NUM_POINTS ) {
            [self.dataForPlot removeObjectAtIndex:0];
            [thePlot deleteDataInIndexRange:NSMakeRange(0, 1)];
        }

        CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)theGraph.defaultPlotSpace;
        NSUInteger location       = (counter >= NUM_POINTS ? counter - NUM_POINTS + 2 : 0);

        CPTPlotRange *oldRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger( (location > 0) ? (location - 1) : 0 )
                                                              length:CPTDecimalFromUnsignedInteger(NUM_POINTS - 2)];
        CPTPlotRange *newRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(location)
                                                              length:CPTDecimalFromUnsignedInteger(NUM_POINTS - 2)];

        [CPTAnimation animate:plotSpace
                     property:@"xRange"
                fromPlotRange:oldRange
                  toPlotRange:newRange
                     duration:CPTFloat(0)];


        NSNumber *x = @(counter);
        NSNumber *y = @(accelerometers.acceleration.x);
        [self.dataForPlot addObject:@{ @"x": x,
                                       @"y": y }];

        dispatch_async(dispatch_get_main_queue(), ^{
            [thePlot insertDataAtIndex:self.dataForPlot.count - 1 numberOfRecords:1];
        });


        counter++;
    }
}
仅供参考。我想要30 FPS。我已经将加速计回调从1/5调整到1/30,并对CPU进行了一些改进,但随后我失去了帧速率

如果我注释掉insertDataAtIndex行,CPU将挂起1%,但图形当然不会跟随新数据。 我没有看到插入法的任何导数

我还在其他线程中读到,重新计算轴标签是一种资源干涉。我试着移除它们,但没有什么改进

我想去OpenGL或CoreGraphics做这项工作


你有什么建议?

注意:我没有在iPhone 5s上测试过(我已经测试过iPhone 4s、5、iPad 3、iPad 4、iPad Mini 1),我们的应用程序似乎有不同的要求,所以我不确定这对你有帮助

不管怎样,在我的测试中,我发现每次我得到一个新的数据点时,我都会重新绘制所有点,从而得到最好、响应最快的结果。这对我来说是最好的,因为我必须每秒更新图形约120次。我身边没有iPhone来测试我们的应用程序的CPU,但在一台iPad Mini上,CPU小于50%,图形上有两个曲线图(每个曲线图约125点,尽管每个曲线图的响应速度相当快,约为250点)。图形仅在y轴上有标签,并且它们不会更改。x轴是时间,我们不需要这些标签

我们的需求可能太不相同,因此此实现无法帮助您,但值得一试。如果你想,它是这样的:

-(void)UpdateGraph
{
    //foreach scatterplot
    {
        //Remove point from array
        //[linePlot deleteDataInIndexRange:NSMakeRange(0, [array count])]
    }
    //Insert new data point into array(s)

    //foreach scatterplot
    {
        //[linePlot insertDataAtIndex:0 numberOfRecords:[array count]]
    }
    //Schedule next update if necessary
    //[self performSelector:@selector(UpdateGraph) withObject:nil afterDelay:(1/(CGFloat)Your_FPS_Here)];
}

希望这对你有帮助,祝你好运

关键是使图形简单、快速绘制。设置标签策略,以避免标签过多。不要使用小刻度或网格线(将线条样式设置为
nil
)。如果不需要主栅格线,也可以将其关闭。不要在绘图上使用区域填充。

为什么要以零(0)的持续时间设置范围动画?只需直接(在主线程上)设置
xRange
,即可完成。如果希望从一个点平滑过渡到下一个点,请使用1/(帧速率)的持续时间。