Подтвердить что ты не робот

Фактическая частота обновления движений устройства ниже, чем ожидалось, но масштабируется с настройкой

Я переношу приложение, которое я изначально написал, используя акселерометр для IOS 3, чтобы включить новые возможности движения IOS 4.

При захвате движения приложение делает немного больше - например, нет графических обновлений.

Я делаю следующее, чтобы настроить обновления движения, в качестве замены моего предыдущего использования акселерометра. Я действительно понимаю, что я мог бы перестроить, чтобы делать свой собственный опрос, используя NSTimer или что-то еще, и может продолжать это делать.

[motionManager setDeviceMotionUpdateInterval:updateInterval];
CMDeviceMotionHandler motionHandler = ^(CMDeviceMotion *motion, NSError *error) {
[self processMotion:motion withError:error];
};

[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:motionHandler];

Это работает, но интервал обновления не работает должным образом. Я удалил весь код выполнения в методе processMotion, за исключением сохранения временных меток, чтобы узнать, что такое реальная скорость обновления. Я проверил это достаточно, чтобы доказать себе, что это повторяемость, даже странный результат для 1/40. В приведенной ниже таблице показано, что я вижу:

updateInterval  actual events per second
1.0/20.0        13
1.0/30.0        27
1.0/40.0        27
1.0/50.0        34
1.0/60.0        40
1.0/70.0        57
1.0/90.0        60
1.0/100.0      74

Некоторые примечания:
1. Я уверен, что интервал обновления установлен правильно и проверил его после настройки для подтверждения.

2. Я уверен, что я отслеживаю каждый вызов processMotion, нет никаких звонков с nil CMDeviceMotion или другой странностью

3. Я не делаю никакой важной обработки, которая бы блокировала бы все, просто ожидая событий движения и записывая их. Все это отлично работало как делегат для акселерометра

4. данные движения хороши, слишком редко обновляются:)

5. это использует ios 4.2 на ipod touch 4th gen

6. Я искал как можно лучше, не видел объяснений, хотя видел некоторые сообщения о том, что люди часто видят частоту обновления 50 Гц при запросе 60 Гц, что может быть связано.

Следующее, что я попробую, это настроить выделенную очередь для обработки вместо использования текущей очереди, однако я хотел бы узнать, было ли это известным поведением. Я мог понять, почему скорость обновления была узким местом, но не знаю, почему она все равно будет масштабироваться, как показано, если это так.

Опять же, я полагаю, я мог бы перестроить, чтобы использовать NSTimer и делать свой собственный опрос, но я хотел бы понять, почему я это вижу, на случай, если я принципиально неправильно понимаю структуру Core Motion.

4b9b3361

Ответ 1

Хорошо, вот возможное решение:

Количество одновременных операций на NSOperationQueue определяется ОС. Это означает, что иногда это может быть очень мало или даже 1 операция за раз.

Вы можете явно указать количество операций на определенное разумное число, например

[operationQueue setMaxConcurrentOperationCount:5];

Enjoy.