जावास्क्रिप्ट में मिलीसेकंड में समय प्राप्त करने का बेहतर तरीका?


141

क्या जावास्क्रिप्ट में कोई विकल्प मिल ऑब्जेक्ट का उपयोग करने के लिए मिलीसेकंड में समय प्राप्त करने का है, या कम से कम उस वस्तु का पुन: उपयोग करने का एक तरीका है, हर बार जब मुझे इस मूल्य को प्राप्त करने की आवश्यकता होती है, तो किसी नई वस्तु को तुरंत प्राप्त किए बिना? मैं यह इसलिए पूछ रहा हूं क्योंकि मैं जावास्क्रिप्ट में एक सरल गेम इंजन बनाने की कोशिश कर रहा हूं, और "डेल्टा फ्रेम टाइम" की गणना करते समय, मुझे हर फ्रेम में एक नया दिनांक ऑब्जेक्ट बनाना होगा। हालांकि मैं इसके प्रदर्शन निहितार्थ के बारे में बहुत चिंतित नहीं हूं, मुझे इस वस्तु द्वारा लौटाए गए सटीक समय की विश्वसनीयता के साथ कुछ समस्याएं हैं।

मुझे एनीमेशन में हर दूसरे या तो कुछ अजीब "कूद" मिलता है, और मुझे यकीन नहीं है कि यह जावास्क्रिप्ट के कचरा संग्रह से संबंधित है या इतनी तेजी से अपडेट करते समय दिनांक ऑब्जेक्ट की सीमा। यदि मैंने डेल्टा मान को कुछ स्थिर पर सेट किया है, तो एनीमेशन अगर पूरी तरह से चिकनी है, तो मुझे पूरा यकीन है कि यह "कूद" जिस तरह से मुझे समय मिलता है, उससे संबंधित है।

एकमात्र प्रासंगिक कोड जो मैं दे सकता हूं, वह यह है कि मैं डेल्टा समय की गणना करता हूं:

prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;

आंदोलन / एनीमेशन की गणना करते समय, मैं डेल्टा समय के साथ एक स्थिर मान गुणा करता हूं।

यदि दिनांक ऑब्जेक्ट का उपयोग करके मिलीसेकंड में समय प्राप्त करने से बचने का कोई तरीका नहीं है, तो एक फ़ंक्शन होगा जो एक चर को बढ़ाता है (खेल शुरू होने के बाद से मिलीसेकंड में बीता हुआ समय), और जिसे एक दर पर सेटटेकर फ़ंक्शन का उपयोग करके कहा जाता है एक बार हर मिलीसेकंड एक कुशल और विश्वसनीय विकल्प होगा?

संपादित करें: मैंने अब अपने कोड को विभिन्न ब्राउज़रों में परीक्षण किया है और ऐसा लगता है कि यह "कूद" वास्तव में क्रोम में ही स्पष्ट है, फ़ायरफ़ॉक्स में नहीं। लेकिन यह तब भी अच्छा होगा जब दोनों ब्राउज़र में काम करने वाला कोई तरीका हो।


5
फ्रेम प्रति एक वस्तु कुछ भी नहीं है
कोडइन्चोस

2
प्रत्येक सेकंड में कूदने वाले एनीमेशन के बारे में, इस तथ्य से कोई लेना-देना नहीं हो सकता है कि Date.getMillisecondsवर्तमान सेकंड में केवल मिलीसेकंड यानी 0 से 999 तक रिटर्न होता है? आप अपने उदाहरण में इस फ़ंक्शन का उपयोग नहीं कर रहे हैं, लेकिन शायद इसका उपयोग कहीं और किया जा रहा है, या एक अलग शाखा पर?
डान रोस

2
क्या कुछ अजीब मिलीसेकंड रिज़ॉल्यूशन मुद्दों से संबंधित कूद है? से मोज़िला डॉक्स : "जब () timestamps या अद्वितीय आईडी बनाने के लिए अब का उपयोग कर, संकल्प विंडोज पर 15 मिलीसेकंड हो सकता है कि ध्यान में रखना"। क्या वह हिचकी से संबंधित हो सकता है?
ज़शु

1
@ ज़शू यह बहुत समय पहले की बात है, इसलिए मुझे इस उदाहरण के लिए कोई विवरण याद नहीं है। लेकिन अधिक हाल के आवेदन के लिए, जब Date.now () का उपयोग कर रहा हूं तो मुझे कोई और कूदता नहीं दिखाई दे रहा है।
कॉलिन डुमिट्रू

जवाबों:


173

प्रयास करें Date.now ()

कचरा संग्रहण के कारण स्किपिंग की सबसे अधिक संभावना है। आमतौर पर जितना संभव हो सके चर का पुन: उपयोग करके कचरा संग्रह से बचा जा सकता है, लेकिन मैं विशेष रूप से यह नहीं कह सकता कि आप कचरा संग्रहण को कम करने के लिए किन तरीकों का उपयोग कर सकते हैं।


1
मैंने Date.now () का उपयोग करने की कोशिश की है, लेकिन मेरे पास अभी भी समान है। इसलिए अब मुझे पूरा यकीन है कि यह कचरा संग्रह के साथ कोई समस्या नहीं है, बल्कि डेट ऑब्जेक्ट के साथ सटीक मान प्राप्त करते समय एक सीमा है। जैसा कि मैंने कहा, सुस्पष्ट एनिमेशन / संक्रमण में लगातार समय के परिणाम के साथ डेल्टा समय की जगह, इसलिए जो एकमात्र कचरा संग्रह हो रहा है, वह "नई तिथि" या "Date.now ()" के साथ है (यदि यह फ़ंक्शन तत्काल ऑब्जेक्ट है तो यह है कि मुझे पता नहीं है)।
कॉलिन डुमिट्रू

22
सिर्फ एक सिर ऊपर: यह IE8 और नीचे में काम नहीं करता है
निक

1
मैं करता / करती हूं: / मैं चाहता हूं कि एमएस में तारीख हो। इतना आवश्यक कुछ के लिए इतना जटिल लगता है।
डेमियन गोल्डिंग

5
@Prozi +1 .. IE वास्तव में बेकार है, जब Im वेब प्रोग्रामिंग मैं वास्तव में IE के बारे में परवाह नहीं है, बस क्रोम और फ़ायरफ़ॉक्स ..........
TechLife

3
@TechLife आपको एंड्रॉइड, सफारी और ओपेरा ब्राउज़र को भी विचार की एक पंक्ति देनी चाहिए, लेकिन मैं मानता हूं कि IE बकवास का भार है। मेरा मतलब है कि यह इतना बुरा है कि MS ने
हार मान ली

49

मुझे पता है कि यह एक बहुत पुराना धागा है, लेकिन चीजों को अद्यतित और अधिक प्रासंगिक बनाए रखने के लिए, आप performance.now()जावास्क्रिप्ट में महीन अनाज का समय पाने के लिए अधिक सटीक कार्यक्षमता का उपयोग कर सकते हैं ।

window.performance = window.performance || {};
performance.now = (function() {
    return performance.now       ||
        performance.mozNow    ||
        performance.msNow     ||
        performance.oNow      ||
        performance.webkitNow ||            
        Date.now  /*none found - fallback to browser default */
})();

2
अंतिम विकल्प Date.nowएक अनाम फ़ंक्शन अभिव्यक्ति के बजाय होना चाहिए
बर्गी

1
इसके अलावा, दुर्भाग्य से पुराने ब्राउज़र में काम नहीं करता है। सौभाग्य से, मैंने अपने ग्राहकों को IE7 और IE8 का समर्थन करने वाले समय के लिए मुझे भुगतान करने के लिए आश्वस्त किया है।
माइकल शेपर

2
|| फ़ंक्शन () {नई तिथि लौटाएं ()। getTime ()}
mmm

2
वर्थ नोटिंग जो performance.now()मोनोटोनिक समय देता है, समय के विपरीत Date। इसका मतलब है कि प्रत्येक बाद की कॉल को पिछले एक से कम नहीं एक मूल्य वापस करने की गारंटी है।
यूजर

48

जहाँ तक मैं जानता हूँ कि आप केवल दिनांक के साथ समय प्राप्त कर सकते हैं

Date.now समाधान है लेकिन हर जगह उपलब्ध नहीं है: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now

var currentTime = +new Date();

यह आपको मिलीसेकंड में वर्तमान समय देता है।

अपने कूद के लिए । यदि आप डेल्टा फ्रेम समय के अनुसार प्रक्षेपों की सही गणना करते हैं करते हैं और आपके पास कुछ राउंडिंग नंबर त्रुटि नहीं है , तो मैं कचरा कलेक्टर (GC) के लिए शर्त लगाता हूं।

यदि आपके लूप में बहुत सारी बनाई गई अस्थायी ऑब्जेक्ट है, तो कचरा संग्रह को कुछ सफाई और मेमोरी री-संगठन बनाने के लिए थ्रेड को लॉक करना पड़ता है।

क्रोम के साथ आप देख सकते हैं कि जीसी टाइमलाइन में कितना समय बिता रहा है पैनल ।

संपादित करें: मेरे उत्तर के बाद से, Date.now()इसे सबसे अच्छा विकल्प माना जाना चाहिए क्योंकि यह हर जगह और IE> = 9 पर समर्थित है।


4
किस +सेवा में काम करता है +new?
एंड्रयू स्कैग्नेली

33
+बस डाली Dateको Number, मिलीसेकेंड में एक मानक यूनिक्स टाइमस्टैम्प दे रही है। आप स्पष्ट रूप से कॉल करके यह मान प्राप्त कर सकते हैं(new Date()).getTime()
ngryman

9
@ मिकेनेलसन: मेरे लिए भयानक नहीं है, यह स्पष्ट है जब आप जानते हैं कि जबरदस्ती कैसे काम करती है। उन्होंने कहा, Date.now()अब पसंद किया जाता है क्योंकि इसका समर्थन अब काफी बड़ा है।
एनक्रीमैन

1
मैं बस +से अधिक पसंद करता हूं .getTime()... यह सरल है और मुझे फ़ंक्शन नामों को याद करने की आवश्यकता नहीं है

2
@TravisJ बहुत बढ़िया शॉर्टकट? एक संख्यात्मक मान प्राप्त करने के लिए जो आपके कंप्यूटर के अंदर पहले से ही आप एक ऑब्जेक्ट बनाते हैं, एक ऑपरेटर को कॉल करते हैं जो एक इंट के लिए परीक्षण करता है और एक रूपांतरण को ट्रिगर करता है जो एक फ़ंक्शन (valueOf) को कॉल करता है जो एक फ़ंक्शन (गेटटाइम) को कॉल करने वाले वर्ग रूपांतरण विधि को कॉल करता है मान निकालता है। फिर ऑब्जेक्ट को उसके भाग्य को छोड़ दिया जाता है, और लूप के 1000 पुनरावृत्तियों के बाद आपके पास 1000 हटाए गए दिनांक ऑब्जेक्ट्स हैं, जिनमें कचरा संग्रह की आवश्यकता होती है, जो कि वहां सभी को एक साथ डंप करते हैं, और जब आपका कंप्यूटर आपको आश्चर्य होता है कि क्या हो रहा है। :) बहुत बढ़िया!
फ्रांसेस्कोएम

7

अगर आपके पास डेट ऑब्जेक्ट जैसी है

var date = new Date('2017/12/03');

तब मिलीसेकंड प्रारूप में दिनांक प्राप्त करने के लिए जावास्क्रिप्ट में इनबिल्ट विधि होती है जो कि valueOf () है

date.valueOf(); //1512239400000 in milliseconds format

2

यह एक बहुत पुराना सवाल है - लेकिन अभी भी संदर्भ के लिए अगर अन्य इसे देख रहे हैं - requestAnimationFrame() आधुनिक ब्राउज़रों में एनीमेशन को संभालने का सही तरीका है:

अद्यतन: मोज़िला लिंक दिखाता है कि यह कैसे करना है - मुझे लिंक के पीछे पाठ को दोहराने की तरह महसूस नहीं हुआ;)


4
ढेर अतिप्रवाह में आपका स्वागत है ! आप requestAnimationFrameइस सवाल में वर्णित के रूप में इस "कूद" को रोकने वाले क्या करता है की एक छोटी व्याख्या शामिल करना चाह सकते हैं । धन्यवाद!
कंतस 94 हेवी

2
यहां तक ​​कि requestAnimationFrame के साथ, हम यह मानने के लिए नहीं हैं कि फ्रेम दर सभी प्लेटफार्मों पर समान है, इसलिए हमें अभी भी वर्तमान समय की जांच करने की आवश्यकता है।
टॉम बॉटेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.