Ios CorePlot慢性能
我有下面的CorePlot(v1.2)代码,它是基于教程的,但是扩展了一点。使用大约30个数据点,在iPhone4S上渲染图形大约需要3秒钟。图表加载正确,只是速度慢。是否有改进性能的方法 以下是NSLog输出形式的代码:Ios CorePlot慢性能,ios,objective-c,core-plot,Ios,Objective C,Core Plot,我有下面的CorePlot(v1.2)代码,它是基于教程的,但是扩展了一点。使用大约30个数据点,在iPhone4S上渲染图形大约需要3秒钟。图表加载正确,只是速度慢。是否有改进性能的方法 以下是NSLog输出形式的代码: 2013-05-30 17:41:20.386 myApp[2796:907] A 2013-05-30 17:41:20.387 myApp[2796:907] B 2013-05-30 17:41:20.388 myApp[2796:907] C 2013-05-30 1
2013-05-30 17:41:20.386 myApp[2796:907] A
2013-05-30 17:41:20.387 myApp[2796:907] B
2013-05-30 17:41:20.388 myApp[2796:907] C
2013-05-30 17:41:20.389 myApp[2796:907] D
2013-05-30 17:41:21.158 myApp[2796:907] E
2013-05-30 17:41:21.160 myApp[2796:907] F
2013-05-30 17:41:22.594 myApp[2796:907] G
-(void)configureAxes {
NSLog(@"A");
// 1 - Create styles
CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
axisTitleStyle.color = [CPTColor whiteColor];
axisTitleStyle.fontName = @"Helvetica-Bold";
axisTitleStyle.fontSize = 12.0f;
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 2.0f;
axisLineStyle.lineColor = [CPTColor whiteColor];
CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
axisTextStyle.color = [CPTColor whiteColor];
axisTextStyle.fontName = @"Helvetica-Bold";
axisTextStyle.fontSize = 11.0f;
CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
tickLineStyle.lineColor = [CPTColor whiteColor];
tickLineStyle.lineWidth = 2.0f;
NSLog(@"B");
// 2 - Get axis set
CPTXYAxisSet *axisSet = (CPTXYAxisSet *) self.hostView.hostedGraph.axisSet;
// 3 - Configure x-axis
CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle];
lineStyle.lineColor = [CPTColor whiteColor];
lineStyle.lineWidth = 2.0f;
CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle];
textStyle.fontName = @"Helvetica";
textStyle.fontSize = 14;
textStyle.color = [CPTColor whiteColor];
axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0.0");
axisSet.xAxis.minorTicksPerInterval = 0;
NSLog(@"C");
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
if ([person.unitPreference isEqualToString:@"US"]) {
[dateFormatter setDateFormat:@"MMM-dd"];
} else {
[dateFormatter setDateFormat:@"dd-MMM"];
}
NSLog(@"D");
CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter];
axisSet.xAxis.labelFormatter = timeFormatter;
axisSet.xAxis.labelRotation = M_PI/4;
axisSet.xAxis.titleOffset = 55.5f;
axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic;
NSLog(@"E");
if ([measurementField isEqualToString:@"mWeight"]) {
NSString *unit;
if ([person.unitPreference isEqualToString:@"METRIC"]) {
unit = @"Kgs";
} else if ([person.unitPreference isEqualToString:@"US"]) {
unit = @"lbs";
} else {
unit = @"st lbs";
}
axisSet.yAxis.title = [NSString stringWithFormat: @"Weight (%@)", unit];
WeightFormatter *weightFormatter = [[WeightFormatter alloc] init];
weightFormatter.person = person;
axisSet.yAxis.labelFormatter = weightFormatter;
} else if ([measurementField isEqualToString:@"mBodyFatPercentage"]) {
axisSet.yAxis.title = @"Body Fat %";
axisSet.yAxis.labelFormatter = [[BodyFatPercentageFormatter alloc] init];
} else {
NSString *unit;
if ([person.unitPreference isEqualToString:@"METRIC"]) {
unit = @"CMs";
} else {
unit = @"Inches";
}
axisSet.yAxis.title = [NSString stringWithFormat: @"Measurements (%@)", unit];
MeasurementFormatter *measurementFormatter = [[MeasurementFormatter alloc] init];
measurementFormatter.person = person;
axisSet.yAxis.labelFormatter = measurementFormatter;
}
NSLog(@"F");
axisSet.yAxis.titleTextStyle = textStyle;
axisSet.yAxis.titleOffset = 40.0f + marginOffset;
axisSet.yAxis.axisLineStyle = lineStyle;
axisSet.yAxis.majorTickLineStyle = lineStyle;
axisSet.yAxis.minorTickLineStyle = lineStyle;
axisSet.yAxis.labelTextStyle = textStyle;
axisSet.yAxis.labelOffset = 3.0f;
axisSet.yAxis.majorIntervalLength = CPTDecimalFromFloat((yAxisMax-yAxisMin)/10.0f);
axisSet.yAxis.minorTicksPerInterval = 1;
axisSet.yAxis.minorTickLength = 5.0f;
axisSet.yAxis.majorTickLength = 7.0f;
axisSet.yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0];
axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(yAxisMin);
axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(oneDay);
NSLog(@"G");
}
注意:代码运行完成后,在图形渲染之前还有大约0.5秒的延迟
以及守则:
2013-05-30 17:41:20.386 myApp[2796:907] A
2013-05-30 17:41:20.387 myApp[2796:907] B
2013-05-30 17:41:20.388 myApp[2796:907] C
2013-05-30 17:41:20.389 myApp[2796:907] D
2013-05-30 17:41:21.158 myApp[2796:907] E
2013-05-30 17:41:21.160 myApp[2796:907] F
2013-05-30 17:41:22.594 myApp[2796:907] G
-(void)configureAxes {
NSLog(@"A");
// 1 - Create styles
CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
axisTitleStyle.color = [CPTColor whiteColor];
axisTitleStyle.fontName = @"Helvetica-Bold";
axisTitleStyle.fontSize = 12.0f;
CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
axisLineStyle.lineWidth = 2.0f;
axisLineStyle.lineColor = [CPTColor whiteColor];
CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
axisTextStyle.color = [CPTColor whiteColor];
axisTextStyle.fontName = @"Helvetica-Bold";
axisTextStyle.fontSize = 11.0f;
CPTMutableLineStyle *tickLineStyle = [CPTMutableLineStyle lineStyle];
tickLineStyle.lineColor = [CPTColor whiteColor];
tickLineStyle.lineWidth = 2.0f;
NSLog(@"B");
// 2 - Get axis set
CPTXYAxisSet *axisSet = (CPTXYAxisSet *) self.hostView.hostedGraph.axisSet;
// 3 - Configure x-axis
CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle];
lineStyle.lineColor = [CPTColor whiteColor];
lineStyle.lineWidth = 2.0f;
CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle];
textStyle.fontName = @"Helvetica";
textStyle.fontSize = 14;
textStyle.color = [CPTColor whiteColor];
axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0.0");
axisSet.xAxis.minorTicksPerInterval = 0;
NSLog(@"C");
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
if ([person.unitPreference isEqualToString:@"US"]) {
[dateFormatter setDateFormat:@"MMM-dd"];
} else {
[dateFormatter setDateFormat:@"dd-MMM"];
}
NSLog(@"D");
CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter];
axisSet.xAxis.labelFormatter = timeFormatter;
axisSet.xAxis.labelRotation = M_PI/4;
axisSet.xAxis.titleOffset = 55.5f;
axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic;
NSLog(@"E");
if ([measurementField isEqualToString:@"mWeight"]) {
NSString *unit;
if ([person.unitPreference isEqualToString:@"METRIC"]) {
unit = @"Kgs";
} else if ([person.unitPreference isEqualToString:@"US"]) {
unit = @"lbs";
} else {
unit = @"st lbs";
}
axisSet.yAxis.title = [NSString stringWithFormat: @"Weight (%@)", unit];
WeightFormatter *weightFormatter = [[WeightFormatter alloc] init];
weightFormatter.person = person;
axisSet.yAxis.labelFormatter = weightFormatter;
} else if ([measurementField isEqualToString:@"mBodyFatPercentage"]) {
axisSet.yAxis.title = @"Body Fat %";
axisSet.yAxis.labelFormatter = [[BodyFatPercentageFormatter alloc] init];
} else {
NSString *unit;
if ([person.unitPreference isEqualToString:@"METRIC"]) {
unit = @"CMs";
} else {
unit = @"Inches";
}
axisSet.yAxis.title = [NSString stringWithFormat: @"Measurements (%@)", unit];
MeasurementFormatter *measurementFormatter = [[MeasurementFormatter alloc] init];
measurementFormatter.person = person;
axisSet.yAxis.labelFormatter = measurementFormatter;
}
NSLog(@"F");
axisSet.yAxis.titleTextStyle = textStyle;
axisSet.yAxis.titleOffset = 40.0f + marginOffset;
axisSet.yAxis.axisLineStyle = lineStyle;
axisSet.yAxis.majorTickLineStyle = lineStyle;
axisSet.yAxis.minorTickLineStyle = lineStyle;
axisSet.yAxis.labelTextStyle = textStyle;
axisSet.yAxis.labelOffset = 3.0f;
axisSet.yAxis.majorIntervalLength = CPTDecimalFromFloat((yAxisMax-yAxisMin)/10.0f);
axisSet.yAxis.minorTicksPerInterval = 1;
axisSet.yAxis.minorTickLength = 5.0f;
axisSet.yAxis.majorTickLength = 7.0f;
axisSet.yAxis.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0];
axisSet.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromFloat(yAxisMin);
axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(oneDay);
NSLog(@"G");
}
这是coreplot 1.2引入的。以下几行可能会导致应用程序长时间挂起:
axisSet.xAxis.labelRotation = M_PI/4;
axisSet.xAxis.titleOffset = 55.5f;
恢复到1.1立即解决了问题。从上面@Eric Skroch的评论来看,这可能会在1.3中得到修复,但在此之前我希望使用一个稳定的版本,尤其是因为我没有使用1.2中的任何新功能
另一方面,我认为旧库不能与我的iPhone 5配合使用的原因是没有以下内容:
将标签策略设置为“无”非常重要,以明确您将要自定义x轴和y轴
CPTAxis *x = axisSet.xAxis;
CPTAxis *y = axisSet.yAxis;
x.labelingPolicy = CPTAxisLabelingPolicyNone;
y.labelingPolicy = CPTAxisLabelingPolicyNone;
您使用的核心图是什么版本?当图形最终显示时,它是否显示正确?谢谢Eric,我使用的是1.2,并且图形的渲染正确。事实上,我最近从1.1升级到了1.1,因为我在iPhone5上遇到了1.1的问题。我可以尝试回滚,看看新版本是否引入了性能开销。我很久以前就完成了所有这些代码,不记得当时在性能方面有任何问题,但我的内存很脆弱。。。我必须承认,我认为这不是由新版本引起的,但这似乎很有道理。1.2确实存在一个问题,它有时会创建大量额外的轴标签,从而减慢了速度。我在你发布的代码中没有看到任何可能引发问题的东西,但这仍然是可能的。如果您将此问题追溯到1.2版本,请使用Mercurial获取最新代码以获得修复。您从何处调用此函数?我怀疑它正在为您所做的每一次更改更新轴…edo42,不,它们只被调用一次。