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

StackOverflow https://stackoverflow.com/questions/5034411

Вопрос

Я портирую приложение, которое я изначально написал с помощью акселерометра для 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];

Это работает, но интервал обновления не ведет себя как ожидалось. Я убрал весь код выполнения в методе процесса процесса, за исключением сохранения временных метров, чтобы увидеть, какое значение обновления реального движения. Я проверил этого достаточно, чтобы доказать себе, что это повторяется, даже странный результат для 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. Я уверен, что я отслеживаю каждый звонок процесса, нет никаких звонков, сделанных с Nil Cmdevicemotion или другой странностью



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

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


5. Это использует iOS 4.2 на iPod Touch 4-й RUN


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

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

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

Это было полезно?

Решение

Okay, here's a possible solution:

Number of concurrent operations on NSOperationQueue are determined by the OS. That means it sometimes can be very few or even 1 operation at a time.

You can explicitly set the number of operations to a certain reasonable number, e.g.

[operationQueue setMaxConcurrentOperationCount:5];

Enjoy.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top