私はしばらくAR フレームワークに取り組んでおり、 UIAccelerometer (非推奨) から CMMotionManager に更新しようとしていますが、効率の問題が発生していますか?
基本的に、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 はフリーズするだけです...
(必要に応じて詳細を説明できますが、説明するのは比較的複雑です)