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