Фактическая частота обновлений движения устройства ниже ожидаемой, но увеличивается с настройкой - PullRequest
12 голосов
/ 17 февраля 2011

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

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

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

[motionManager setDeviceMotionUpdateInterval:updateInterval];<br/> CMDeviceMotionHandler motionHandler = ^(CMDeviceMotion *motion, NSError *error) {<br/> [self processMotion:motion withError:error];<br/> };<br/><br/> [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 4-го поколения6. Я искал как мог, не видел объяснений, хотя я видел некоторые сообщения о людях, которые видели частоту обновления 50 Гц при запросе 60 Гц, что может быть связано.

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

1 Ответ

2 голосов
/ 19 января 2012

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

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

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

[operationQueue setMaxConcurrentOperationCount:5];

Наслаждайтесь.

...