【问题标题】:accelerometer data not correct, delayed for few seconds加速度计数据不正确,延迟几秒钟
【发布时间】:2015-02-17 17:54:38
【问题描述】:

我正在使用 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)
}

我错过了什么吗?

谢谢

【问题讨论】:

  • 你确定是加速度计数据,而不是物理引擎因为“丢帧”而试图追赶吗?在任何情况下,当应用程序进入后台时停止加速计,并在应用程序进入前台时重新启动它可能是个好主意。这也应该会显示一个暂停屏幕,以便用户有时间为游戏继续做准备。
  • 其实这点很好。我同意您的“引擎由于错过帧而试图追赶”。这就是我遇到问题时的感觉。如您所说,我将尝试停止并重新启动加速度计。谢谢你。

标签: ios swift sprite-kit game-physics


【解决方案1】:

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

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,这是一个很好的折衷方案,既能流畅又能响应涂鸦跳跃之类的游戏,或者可能是移动球。

我不知道为什么加速度计数据在启动时不正确/延迟,我的猜测是硬件必须唤醒并自行校准,但不管为什么,如果你实现一个过滤器,它就会平滑这些违规行为,它们几乎不会那么明显。

【讨论】:

  • 谢谢你的建议,我不认为这是平滑尖峰的问题,但我以后肯定会需要这个!
【解决方案2】:

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

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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2018-04-08
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    相关资源
    最近更新 更多