Die tatsächliche Häufigkeit von Gerätebewegungsaktualisierungen niedriger als erwartet, aber mit der Einstellung skaliert

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

Frage

Ich passe eine App an, die ich ursprünglich mit dem Beschleunigungsmesser für iOS 3 geschrieben habe, um die neuen IOS 4-Motion-Funktionen zu integrieren.

Während der Aufnahme der Bewegung, ist die Anwendung wenig anderes - zum Beispiel keine Grafik-Updates.

Ich mache Folgendes, um Motion Updates aufzubauen, als Ersatz für meine vorherige Verwendung des Beschleunigungsmessers. Ich merke, dass ich neu erstellen könnte, um mein eigenes Abholung mit Nstimer oder etwas zu tun, und kann das noch verfolgen.

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

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

Dies funktioniert, aber das Update-Intervall verhält sich nicht wie erwartet. Ich habe den gesamten Ausführungscode in der ProzessMotion-Methode ausgezogen, mit Ausnahme, dass Timestamps gespeichert werden, um zu sehen, was die echte Motion-Update-Rate ist. Ich habe das genug getestet, um mir selbst zu beweisen, dass es wiederholbar ist, selbst das seltsame Ergebnis für 1/40. Die folgende Tabelle zeigt, was ich sehe: generasacodicetagpre.

Einige Anmerkungen:
1. Ich bin sicher, dass das Update-Intervall ordnungsgemäß eingestellt wird, und habe es nach dem Einstellen geprüft, um zur Bestätigung zu bestätigen.

2. Ich bin sicher, dass ich jeden Anruf der Prozessmotion verfolgen, es gibt keine Anrufe, die mit Null Cmdevicemotion oder anderen Fremdsness gemacht wurden


3. Ich mache keine signifikante Bearbeitung, die die Dinge blockieren würde, nur auf Bewegungseignisse warten und sie aufnehmen. Dies alles funktionierte perfekt als Delegierter für das Beschleunigungsmesser

4. Die Bewegungsdaten sind gut, einfach zu selten aktualisiert :)

5. Dies verwendet iOS 4.2 auf einem iPod touch 4. Gen

6. Ich habe so am besten gesucht, dass ich keine Erklärung gesehen habe, obwohl ich einige Berichte über Menschen gesehen habe, die bei der Anfrage von 60 Hz die 50-Hz-Aktualisierungsfrequenz sehen, die zusammenhängt.

Das nächste, was ich versuche, wird eine dedizierte Warteschlange für die Verarbeitung anstelle der aktuellen Warteschlange eingerichtet, jedoch wollte ich sehen, ob dies ein bekanntes Verhalten war. Ich konnte verstehen, ob die Aktualisierungsrate irgendwie eingeben war, aber nicht sicher, warum es immer noch wie gezeigt auskalkuliert würde, wenn das der Fall war.

Ich nehme an, ich könnte wieder aufbauen, um Nstimer zu verwenden und mein eigenes Umfeld zu verwenden, aber ich würde gerne verstehen, warum ich das sehe, in dem ich das Kernbewegungsrahmen grundlegend missverstanden habe.

War es hilfreich?

Lösung

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top