加速度计数据不正确,延迟几秒
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
}
}
我正在使用 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
}
}