Timer Tepat Corona SDK

Halo semuanya. Dalam artikel singkat ini saya akan memberi tahu Anda cara membuat penghitung waktu di aplikasi Anda pada Corona SDK dengan indikator ketepatan membaca yang dapat diterima. Kami juga mempertimbangkan apa masalah dari pengatur waktu standar.

Masalah berikut akan dipecahkan dalam artikel: Untuk membuat aplikasi yang akan menunjukkan waktu yang berlalu sejak aplikasi dihidupkan dengan pembaruannya 1 kali per detik.

1. Solusi standar yang jelas.


Buat pengatur waktu standar dan tampilkan tanda centangnya.

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

Semuanya tampak jelas, tetapi ada fitur dalam karya solusi ini:

  • Pertama, timer standar dapat bekerja dengan benar dan cukup akurat, timeout mulai dari 300-400ms, dan segala sesuatu di bawah nilai ini mulai tertinggal sangat signifikan, tetapi kasus kami berbeda karena batas waktu lebih dari batas yang ditentukan. Periode centang minimum yang mungkin dari timer (jika Anda menentukan 1 ms) adalah 1 / fps, mis. 16. (6) ms untuk 60 frame atau 33. (3) ms untuk 30 frame.
  • Kedua, bahkan pada periode yang relatif akurat yang ditunjukkan, ada kesalahan acak sekitar 5-10 ms dari setiap centang, yaitu. kesalahan 15-30 detik habis dalam satu jam. Masalah ini sebagian dapat diselesaikan dengan mengurangi 5 ms dari nilai yang ditentukan dalam parameter saat membuat timer, yaitu bukannya 1000 tentukan 995.
  • Ketiga, jika jalur kecil muncul di aplikasi Anda yang disebabkan oleh hasil kode lain atau operasi perangkat yang tidak stabil, jalur ini juga akan ditambahkan ke tumpukan waktu.
  • Keempat, jika Anda meminimalkan aplikasi untuk beberapa waktu dan kemudian memindahkannya, semua waktu aplikasi telah diminimalkan akan dikecualikan dari jumlah detik aplikasi telah berjalan.

2. Keputusan yang bagus.


Untuk mengatasi masalah metode sebelumnya, kami menggunakan desain berikut, dalam metode ini kami menggunakan timer dengan kecepatan setinggi mungkin, tetapi sinyal untuk tick timer akan menjadi perhitungan berdasarkan sumber waktu yang tepat dari sistem.

 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) 

Kami menganalisis fitur dari metode ini. Terlepas dari kenyataan bahwa kami menunjukkan frekuensi centang 1ms seperti yang dijelaskan di atas, quanta tick nyata akan dilakukan setiap 16 (33) -50ms, dan ini akan menentukan kemungkinan kesalahan maksimum dari metode di atas, kesalahan akan bervariasi dalam kisaran 0,.50 ms dari centang untuk menandai, mis. tingkat pengulangan centang akan kurang stabil daripada di metode pertama, tetapi nilai kesalahan ini pada jarak berapa pun (bahkan dalam tahun) akan sama, yaitu. bahkan setelah satu tahun, kutu kami berikutnya akan memiliki kesalahan dalam kisaran yang sama relatif terhadap kutu pertama.

3. Verifikasi hasil


Saya akan memberikan contoh bagaimana memverifikasi keadilan semua hal di atas. Sumber yang diberikan satu kali akan menampilkan waktu saat ini berlalu sejak aplikasi dihidupkan untuk dua timer (secara terpisah) dan menunjukkan kesalahan akumulasi selama operasi.

 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) 

Semoga beruntung untuk semuanya!

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


All Articles