加速度计数据不正确,延迟几秒

accelerometer data not correct, delayed for few seconds

我正在使用 Swift 和 SpriteKit 创建一个非常简单的游戏,我正在使用加速度计数据(加速度 x、y)在屏幕上移动一个球。

我会说代码工作正常,但我注意到有时(通常是在我打开应用程序时)加速度计数据不正确并延迟了几秒钟。

为什么会这样?

我正在使用以下代码读取加速度计数据:

if motionManager.accelerometerAvailable == true {
        motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:{
            data, error in
            self.accX = CGFloat(data.acceleration.x)
            self.accY = CGFloat(data.acceleration.y)
        })
}

并且函数更新以对球施加一些冲量:

override func update(currentTime: CFTimeInterval) {
    var impulse = CGVectorMake(accX, accY)
    var obj = childNodeWithName("ball") as SKSpriteNode
    obj.physicsBody?.applyImpulse(impulse)
}

我是不是漏掉了什么?

谢谢

对于任何加速度计数据,最好 运行 通过过滤器来消除任何不规则尖峰。这是我最喜欢的:

double filteredAcceleration[3];
memset(filteredAcceleration, 0, sizeof(filteredAcceleration));
CMAccelerometerData *newestAccel = motionManager.accelerometerData;
filteredAcceleration[0] = (filteredAcceleration[0]*(1.0-alpha)) + (newestAccel.acceleration.x*alpha);
filteredAcceleration[1] = (filteredAcceleration[1]*(1.0-alpha)) + (newestAccel.acceleration.y*alpha);
filteredAcceleration[2] = (filteredAcceleration[2]*(1.0-alpha)) + (newestAccel.acceleration.z*alpha);

alpha可以是0到1之间的任意值,越接近1越灵敏,越接近0越平滑。 iPhone 我最喜欢的值是 0.2 对于像涂鸦跳跃这样的游戏,或者可能是移动球,它是流畅但响应迅速的一个很好的折衷。

我不知道为什么加速计数据在启动时是 incorrect/delayed,我的猜测是硬件必须唤醒并自我校准,但不管为什么,如果你实现一个过滤器,它会消除这些不规则现象,并且它们不会那么明显。

我已优先考虑这两个功能,问题似乎已解决。

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    // do some task
    dispatch_async(dispatch_get_main_queue()) {
        // code with priority
    }
}