التكرار الفعلي لتحديثات حركة الجهاز أقل من المتوقع، ولكنه يرتفع مع الإعداد

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];

يعمل هذا، ولكن الفاصل الزمني للتحديث لا يعمل كما هو متوقع.لقد قمت بتجريد جميع أكواد التنفيذ في طريقة 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 الجيل الرابع

6.لقد بحثت بأفضل ما أستطيع، ولم أجد تفسيرًا، على الرغم من أنني رأيت بعض التقارير عن أشخاص يرون تردد تحديث 50 هرتز عند طلب 60 هرتز، وهو ما قد يكون ذا صلة.

والشيء التالي الذي سأحاوله هو إعداد قائمة انتظار مخصصة للمعالجة بدلاً من استخدام قائمة الانتظار الحالية، ولكنني أردت معرفة ما إذا كان هذا سلوكًا معروفًا.أستطيع أن أفهم ما إذا كان معدل التحديث قد تعرض للاختناق بطريقة أو بأخرى، ولكن لست متأكدًا من سبب استمرار رفع مستوى التحديث كما هو موضح إذا كان هذا هو الحال.

مرة أخرى، أفترض أنه يمكنني إعادة البناء لاستخدام NSTimer وإجراء الاستطلاع الخاص بي، ولكن أود أن أفهم سبب رؤيتي لهذا، في حالة سوء فهم إطار عمل Core Motion بشكل أساسي.

هل كانت مفيدة؟

المحلول

حسنًا، إليك الحل الممكن:

عدد العمليات المتزامنة NSOperationQueue يتم تحديدها من قبل نظام التشغيل.وهذا يعني أنه في بعض الأحيان قد يكون هناك عدد قليل جدًا أو حتى عملية واحدة في المرة الواحدة.

يمكنك تعيين عدد العمليات بشكل صريح إلى عدد معقول معين، على سبيل المثال.

[operationQueue setMaxConcurrentOperationCount:5];

يتمتع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top