基本上看起来CMMotionManager比UIAccelerometer要大得多且速度较慢。有人之前遇到CMMotionManager的性能问题吗?
正如您可以在这里看到的那样,我有这个:
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 则会完全冻结...
(如果您想要更多细节,我可以提供,但相对来说解释起来比较复杂)
deviceMotion.accelerometerData.gravity
。 - alecail