我已经在 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 会死机……

(如果你愿意,我可以给你更多细节,但解释起来相对复杂)

最佳答案

我刚刚遇到了同样的问题,您不知道吗,解决方案在文档中;)

问题在于块格式。所有的教程似乎都支持这种方法,但 Apple 建议定期轮询 CMMotionManager 作为更注重性能的方法。块格式增加了开销。

来自 CMMotionManager 类引用:



所以你想做什么,再次从文档中:



沿着这些路线的东西

CMMotionManager *mManager = [(AppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];

[mManager startAccelerometerUpdates];

然后,在您选择的某种定期更新方法中:
CMMotionManager *mManager = [(SEPAppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];

CMAccelerometerData *aData = mManager.accelerometerData;

根据我所做的有限测试,此解决方案似乎与 iPhone 4 上的 UIAccelerometer 一样有效。

关于ios - CMMotionManager 与 UIAccelerometer 效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17659352/

10-11 17:24