- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在研究 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 会死机...
(如果你愿意,我可以给你更多细节,但解释起来相对复杂)
最佳答案
我刚刚遇到了同样的问题,你不知道吗,解决方案在文档中;)
问题出在 block 格式上。所有教程似乎都支持这种方法,但 Apple 建议定期轮询 CMMotionManager
作为一种更注重性能的方法。 block 格式增加了开销。
来自 CMMotionManager
类引用:
To handle motion data by periodic sampling, the app calls a “start” method taking no arguments and periodically accesses the motion data held by a property for a given type of motion data. This approach is the recommended approach for apps such as games. Handling accelerometer data in a block introduces additional overhead, and most game apps are interested only the latest sample of motion data when they render a frame.
那么你想做什么,再次来自文档:
Call startAccelerometerUpdates to begin updates and periodically access CMAccelerometerData objects by reading the accelerometerData property.
类似的东西
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 vs UIAccelerometer 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17659352/
所以我在我的游戏中做了一个基本的校准,如下所示:校准代码: - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(
在我的应用中,我使用加速度计来控制游戏中的角色。现在我只允许纵向,所以用户必须向右或向左倾斜设备才能移动角色。到目前为止一切正常。我现在想要完成的是“校准”加速度计以考虑用户正在玩的当前倾斜度。假设用
我想根据 UIAccelerometer 值滚动 ScrollView 。实现这一目标的最佳方法是什么? 最初,我根据获得的加速度计值将内容偏移设置为一个值。然后在每个 scrollViewDidEn
是否有框架或示例代码展示如何使用 UIAccelerometer 来控制屏幕上的水平,类似于气泡水平应用? 我意识到我需要像这样使用它: UIAccelerometer *accel = [UIAcc
我正在开发一个可以在后台运行的导航应用程序。由于将 UIAccelerometer 设置为 location,所以工作正常。但我也想使用加速度计,以获取有关用户正在做什么的一些额外信息。但是,在后台时
我正在使用 xcode 4.2(并且即将升级)和这些代码行 [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / kAccel
我是 iOS 开发新手。 我按照 Ray Wenderlich 的教程进行操作创建一个基于位置的小型 AR 应用程序。但是,本教程使用 AR Toolkit已经有一段时间没有更新了。它使用的 UIAc
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我一直在研究 AR framework现在有一段时间了,我正在努力update from UIAccelerometer (deprecated) to CMMotionManager但遇到了一些效率
我有点困惑。请帮我 。我写了这段代码。我得到了 distX、distY 和 distZ 。现在我想要使用这三个来计算最终距离。 -(void)accelerometer:(UIAcceleromete
在我的游戏中,我的主角是 CCSprite。 CCSprite 是 UIAccelerometer 的 Controller ,我通过 self.isAccelerometerEnabled = YE
我实际上并没有在我的应用程序中使用加速度计,但此警告是我在构建过程中收到的唯一警告。我想纠正它或消除它。此警告将我引导至 CCLayer.m cocos2d 原始文件。有 4 个关于 UIAccele
基于 this文档中,CMAccelerometerData 类(在 Core Motion 框架中找到)有一个名为 acceleration 的 CMAcceleration 类型的属性,它是包含
我正在尝试通过我的 .xib 中的 UISlider 更改我的 UIAcceleromter 的 updateInterval。我的 NSLogs 完美地向我展示了这些值,但是当我移动 slider
我编写这段代码是为了在 xcode 中从 UIAccelerometer 获取 G 值。你能告诉我这对不对吗? -(void)accelerometer:(UIAccelerometer *)acce
我尝试在 Xcode 5 下针对 iOS 6 SDK 编译我的应用程序。我遵循了一些教程如何在 Xcode 5 中使用旧的 iOS SDK:将 SDK 从旧的 Xcode (4.6.3) 复制到 Xc
我是一名优秀的程序员,十分优秀!