【发布时间】:2013-07-15 16:42:07
【问题描述】:
我已经在AR framework 上工作了一段时间,我正在尝试update from UIAccelerometer (deprecated) to CMMotionManager,但遇到了一些效率问题?
基本上,CMMotionManager 似乎比 UIAccelerometer 大得多且慢得多。以前有没有人遇到过 CMMotionManager 的性能问题?
如您所见here,我有这个:
accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.updateInterval = 0.01;
[accelerometer setDelegate:self];
和
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
rollingZ = (acceleration.z * kFilteringFactor) + (rollingZ * (1.0 - kFilteringFactor));
rollingX = (acceleration.y * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
if (rollingZ > 0.0) currentInclination = inc_avg(atan(rollingX / rollingZ) + M_PI / 2.0);
else if (rollingZ < 0.0) currentInclination = inc_avg(atan(rollingX / rollingZ) - M_PI / 2.0);
else if (rollingX < 0) currentInclination = inc_avg(M_PI/2.0);
else if (rollingX >= 0) currentInclination = inc_avg(3 * M_PI/2.0);
}
即使在 iPhone 4 等“旧”设备上也能正常工作(不是很旧,但是是的......)。
但是当尝试完全相同的代码但使用 CMMotionManager 时:
motionManager = [[CMMotionManager alloc] init];
与
[motionManager setAccelerometerUpdateInterval:0.01];
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMAccelerometerData *accelerometerData, NSError *error){
rollingZ = (accelerometerData.acceleration.z * kFilteringFactor) + (rollingZ * (1.0 - kFilteringFactor));
rollingX = (accelerometerData.acceleration.y * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
if (rollingZ > 0.0) currentInclination = inc_avg(atan(rollingX / rollingZ) + M_PI / 2.0);
else if (rollingZ < 0.0) currentInclination = inc_avg(atan(rollingX / rollingZ) - M_PI / 2.0);
else if (rollingX < 0) currentInclination = inc_avg(M_PI/2.0);
else if (rollingX >= 0) currentInclination = inc_avg(3 * M_PI/2.0);
}];
数学似乎减慢了它的废话..!我这样说是因为当我删除所有数学部分时效果很好。
iPhone 5 可以正常工作,但 iPhone 4S 会出现滞后迹象,而 iPhone 4 会卡住......
(如果你愿意,我可以给你更多细节,但解释起来相对复杂)
【问题讨论】:
标签: ios performance math uiaccelerometer cmmotionmanager