توقيت كورونا SDK دقيقة

مرحبا بالجميع. في هذه المقالة القصيرة سأخبرك بكيفية عمل مؤقت في تطبيقك على Corona SDK مع مؤشر مقبول لدقة القراءة. ضع في اعتبارك أيضًا مشاكل جهاز ضبط الوقت القياسي.

سيتم حل المشكلة التالية في المقالة: قم بإنشاء تطبيق يعرض الوقت المنقضي منذ تشغيل التطبيق مع تحديثه مرة واحدة في الثانية.

1. الحل القياسي الواضح.


قم بإنشاء مؤقت قياسي وعرض علاماته.

timeout = 1000 timer.performWithDelay( timeout,function(event) print(event.count) end,0) 

يبدو أن كل شيء واضح ، ولكن هناك ميزات في عمل هذا الحل:

  • أولاً ، الموقت القياسي قادر على تحديد المهلات بشكل صحيح ودقيق بدءًا من 300-400 مللي ثانية ، وكل شيء أقل من هذه القيمة يبدأ في التأخير بشكل كبير جدًا ، لكن حالتنا مختلفة لأن المهلة أكثر من الحدود المحددة. الحد الأدنى لفترة التأخير الممكنة للمؤقت (إذا حددت 1 مللي ثانية) هو 1 / fps ، أي 16. (6) مللي ثانية لـ 60 إطارًا أو 33. (3) مللي ثانية لـ 30 إطارًا.
  • ثانيًا ، حتى في الفترة المحددة نسبيًا ، هناك خطأ عشوائي يبلغ حوالي 5-10 مللي ثانية من كل علامة ، أي خطأ 15-30 ثانية يعمل في ساعة واحدة. يمكن حل هذه المشكلة جزئيًا عن طريق طرح 5 مللي ثانية من القيمة المحددة في المعلمة عند إنشاء المؤقت ، أي بدلاً من 1000 حدد 995.
  • ثالثًا ، إذا ظهرت أفاريز صغيرة في تطبيقك ناتجة عن رمز آخر أو التشغيل غير المستقر للجهاز ، فستتم إضافة هذه الأفاريز أيضًا إلى تراكم المؤقت.
  • رابعاً ، إذا قمت بتصغير التطبيق لبعض الوقت ثم قمت بإعادة نشره ، فسيتم استبعاد كل الوقت الذي تم فيه تصغير التطبيق من عدد الثواني التي تم تشغيل التطبيق فيها.

2. قرار جيد.


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

 local timeout = 1000-- socket = require "socket" local start_time = socket.gettime()*1000--  ( ) local good_time = 0 timer.performWithDelay( 1,function(event) local new_time = socket.gettime()*1000--   local total_time = new_time - start_time--      local num = math.floor(total_time/timeout)--      timeout if num > good_time then--     good_time = num--  print(good_time) end end,0) 

نقوم بتحليل ميزات هذه الطريقة. على الرغم من حقيقة أننا نشير إلى تردد القراد 1 مللي ثانية كما هو موضح أعلاه ، سيتم تنفيذ كمية التجزئة الحقيقية كل 16 (33) -50 مللي ثانية ، وهذا سيحدد الحد الأقصى من الخطأ المحتمل للطريقة المذكورة أعلاه ، سيختلف الخطأ في النطاق 0.50 مللي ثانية من القراد للقراد ، أي سيكون معدل تكرار القراد أقل استقرارًا من الطريقة الأولى ، ولكن قيمة هذا الخطأ في أي مسافة (حتى في السنوات) ستكون هي نفسها ، أي حتى بعد عام ، سيكون لدينا علامة التجزئة التالية خطأ في نفس النطاق نسبة إلى العلامة الأولى.

3. التحقق من النتائج


سأعطي مثالا لكيفية التحقق من العدالة لجميع ما سبق. سيعرض المصدر المحدد مرة واحدة الوقت الحالي المنقضي منذ تشغيل التطبيق لموقتين (بشكل منفصل) ويظهر الخطأ المتراكم أثناء التشغيل.

 local timeout = 1000 socket = require "socket" local start_time = socket.gettime()*1000--   local good_time = 0--   local bad_time = 0--   --  timer.performWithDelay( timeout,function(event) bad_time = event.count local bad_delta = (socket.gettime()*1000 - start_time) - (bad_time*timeout) print('Bad tick: '..bad_time, 'Delta: '..bad_delta) end,0) --  timer.performWithDelay( 1,function(event) local new_time = socket.gettime()*1000 local total_time = new_time - start_time local num = math.floor(total_time/timeout) if num > good_time then good_time = num local good_delta = (socket.gettime()*1000 - start_time) - (good_time*timeout) print('Good tick: '..good_time, 'Delta: '..good_delta) end end,0) 

بالتوفيق للجميع!

Source: https://habr.com/ru/post/ar422443/


All Articles