Apakah ada alternatif dalam JavaScript untuk mendapatkan waktu dalam milidetik menggunakan objek tanggal, atau setidaknya cara untuk menggunakan kembali objek itu, tanpa harus membuat instance objek baru setiap kali saya perlu mendapatkan nilai ini? Saya menanyakan ini karena saya mencoba membuat mesin gim sederhana dalam JavaScript, dan ketika menghitung "delta frame time", saya harus membuat objek Date baru setiap frame. Meskipun saya tidak terlalu khawatir tentang implikasi kinerja ini, saya mengalami beberapa masalah dengan keandalan waktu yang tepat dikembalikan oleh objek ini.
Saya mendapatkan "lompatan" aneh dalam animasi, setiap detik atau lebih, dan saya tidak yakin apakah ini terkait dengan JavaScript's Garbage Collection atau batasan objek Date saat memperbarui dengan sangat cepat. Jika saya mengatur nilai delta ke beberapa konstanta, maka animasi jika mulus, jadi saya cukup yakin ini "melompat" terkait dengan cara saya mendapatkan waktu.
Satu-satunya kode yang relevan yang dapat saya berikan adalah cara saya menghitung waktu delta:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
Saat menghitung pergerakan / animasi saya mengalikan nilai konstan dengan waktu delta.
Jika tidak ada cara untuk menghindari mendapatkan waktu dalam milidetik dengan menggunakan objek Date, akankah fungsi yang menambah variabel (menjadi waktu yang berlalu dalam milidetik sejak permainan dimulai), dan yang disebut menggunakan fungsi SetTimer pada tingkat sekali setiap milidetik menjadi alternatif yang efisien dan andal?
Sunting: Saya telah menguji sekarang kode saya di browser yang berbeda dan tampaknya "lompatan" ini benar-benar hanya terlihat di Chrome, bukan di Firefox. Tapi alangkah baiknya jika ada metode yang bisa digunakan di kedua browser.
sumber
Date.getMilliseconds
hanya mengembalikan milidetik dalam detik saat ini, yaitu 0 hingga 999? Anda tidak menggunakan fungsi ini dalam contoh Anda, tetapi mungkin sedang digunakan di tempat lain, atau pada cabang yang berbeda?Jawaban:
Coba Date.now () .
Melompati kemungkinan besar karena pengumpulan sampah. Biasanya pengumpulan sampah dapat dihindari dengan menggunakan kembali variabel sebanyak mungkin, tetapi saya tidak bisa mengatakan secara spesifik metode apa yang dapat Anda gunakan untuk mengurangi pengumpulan sampah yang dihentikan.
sumber
Saya tahu ini adalah utas yang cukup lama, tetapi untuk tetap mengikuti perkembangan dan lebih relevan, Anda dapat menggunakan
performance.now()
fungsionalitas yang lebih akurat untuk mendapatkan penentuan waktu butir yang lebih baik dalam javascript.sumber
Date.now
alih-alih ekspresi fungsi anonimperformance.now()
memberi waktu monoton, tidak seperti waktu dariDate
. Ini berarti bahwa setiap panggilan berikutnya dijamin untuk mengembalikan nilai tidak kurang dari yang sebelumnya.Sejauh yang saya tahu Anda hanya bisa mendapatkan waktu dengan Date .
Date.now adalah solusinya tetapi tidak tersedia di mana-mana: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now .
Ini memberi Anda waktu saat ini dalam milidetik.
Untuk lompatanmu . Jika Anda menghitung interpolasi dengan benar sesuai dengan waktu bingkai delta dan Anda tidak memiliki kesalahan angka pembulatan , saya bertaruh untuk pengumpul sampah (GC).
Jika ada banyak objek sementara yang dibuat di loop Anda, pengumpulan sampah harus mengunci utas untuk melakukan pembersihan dan pengaturan ulang memori.
Dengan Chrome Anda dapat melihat berapa banyak waktu yang dihabiskan GC di panel Timeline .
EDIT: Karena jawaban saya,
Date.now()
harus dianggap sebagai opsi terbaik karena didukung di mana-mana dan di IE> = 9.sumber
+
dilayaninya+new
?+
hanya melemparkanDate
keNumber
, memberikan cap waktu unix standar dalam milidetik. Anda dapat secara eksplisit mendapatkan nilai ini dengan menelepon(new Date()).getTime()
Date.now()
lebih disukai sekarang karena dukungannya cukup besar sekarang.+
daripada.getTime()
... Ini lebih sederhana dan saya tidak perlu menghafal namaJika Anda memiliki objek kencan suka
kemudian ada metode inbuilt di javascript untuk mendapatkan tanggal dalam format milidetik yang bernilaiOf ()
sumber
Ini adalah pertanyaan yang sangat lama - tetapi masih untuk referensi jika orang lain melihatnya -
requestAnimationFrame()
adalah cara yang tepat untuk menangani animasi di browser modern:UPDATE: Tautan mozilla menunjukkan cara melakukan ini - saya tidak ingin mengulangi teks di balik tautan;)
sumber
requestAnimationFrame
yang menghentikan "lompatan" ini seperti yang dijelaskan dalam pertanyaan. Terima kasih!