জাভাস্ক্রিপ্টে মিলিসেকেন্ডে সময় পাওয়ার আরও ভাল উপায়?


141

তারিখ অবজেক্টটি ব্যবহার করে মিলিসেকেন্ডে সময় নেওয়ার জন্য জাভাস্ক্রিপ্টের বিকল্প আছে কি না, বা কমপক্ষে সেই জিনিসটি পুনরায় ব্যবহার করার কোনও উপায়, যখনই আমাকে এই মানটি পাওয়ার দরকার হয় ততবার কোনও নতুন অবজেক্ট ইনস্ট্যান্ট না করেই? আমি এটি জিজ্ঞাসা করছি কারণ আমি জাভাস্ক্রিপ্টে একটি সাধারণ গেম ইঞ্জিন তৈরি করার চেষ্টা করছি এবং "ডেল্টা ফ্রেম সময়" গণনা করার সময়, আমাকে প্রতিটি ফ্রেমে একটি নতুন ডেট অবজেক্ট তৈরি করতে হবে। যদিও আমি এর পারফরম্যান্সের প্রভাবগুলি সম্পর্কে খুব বেশি চিন্তিত নই, তবে এই বিষয়টির দ্বারা সঠিক সময়ে ফিরে আসার নির্ভরযোগ্যতা নিয়ে আমার কিছু সমস্যা হচ্ছে।

আমি অ্যানিমেশনটিতে প্রতি সেকেন্ডে বা তার কিছু অদ্ভুত "জাম্পিং" পেয়েছি এবং আমি নিশ্চিত নই যে এটি এত দ্রুত আপডেট করার সময় জাভাস্ক্রিপ্টের আবর্জনা সংগ্রহ বা তারিখ অবজেক্টের সীমাবদ্ধতার সাথে সম্পর্কিত কিনা I যদি আমি বদ্বীপের মানটিকে কিছু ধ্রুবক হিসাবে সেট করি তবে অ্যানিমেশনটি যদি পুরোপুরি মসৃণ হয় তবে আমি নিশ্চিত যে এই "জাম্পিং" সময় পাবার সাথে সম্পর্কিত।

আমি কেবল প্রাসঙ্গিক কোড দিতে পারি যে আমি ব-দ্বীপের সময় গণনা করি:

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

চলাচল / অ্যানিমেশন গণনা করার সময় আমি ব-দ্বীপ সময়ের সাথে একটি ধ্রুবক মানের গুণ করি।

ডেট অবজেক্টটি ব্যবহার করে যদি মিলি সেকেন্ডে সময় না এড়ানোর কোনও উপায় না থাকে, তবে এমন একটি ফাংশন যা কোনও ভেরিয়েবলকে বাড়িয়ে তোলে (গেম শুরু হওয়ার পর থেকে মিলি সেকেন্ডের মধ্যে সময় কাটানো), এবং সেটটিমার ফাংশনটিকে হারের হারে বলা হয় প্রতি মিলিসেকেন্ড একবারে কার্যকর এবং নির্ভরযোগ্য বিকল্প হতে পারে?

সম্পাদনা: আমি এখন আমার কোডটি বিভিন্ন ব্রাউজারে পরীক্ষা করেছি এবং দেখে মনে হচ্ছে যে এই "জাম্প" ফায়ারফক্সে নয়, কেবল ক্রোমে প্রকাশিত। তবে উভয় ব্রাউজারে এমন কোনও পদ্ধতি ছিল যা কাজ করে তা এখনও ভাল হবে।


5
ফ্রেম প্রতি একটি বস্তু কিছুই নয়
কোডসইনচাউস

2
প্রতি সেকেন্ডে অ্যানিমেশন জাম্পিং সম্পর্কে, এটি কি Date.getMillisecondsবর্তমান সেকেন্ডে কেবল মিলিসেকেন্ডগুলি, অর্থাৎ 0 থেকে 999 ফেরত দেয় তার সাথে কি কিছু থাকতে পারে ? আপনি আপনার উদাহরণে এই ফাংশনটি ব্যবহার করছেন না, তবে সম্ভবত এটি অন্য কোথাও ব্যবহার করা হচ্ছে, বা অন্য কোনও শাখায়?
ড্যান রস

2
জাম্পিং কি কিছু অদ্ভুত মিলিসেকেন্ড রেজোলিউশন সমস্যার সাথে সম্পর্কিত? থেকে মজিলা ডক্স : "যখন () টাইমস্ট্যাম্প অথবা অনন্য ID- র তৈরি করতে এখন ব্যবহার করে, রেজল্যুশন উইন্ডোজ 15 মিলিসেকেন্ড হতে পারে যে মনে রাখা"। এটি কি হিচাপের সাথে সম্পর্কিত হতে পারে?
zashu

1
@ জাশু এটি অনেক দিন আগে ছিল, সুতরাং এই উদাহরণটির কোনও বিশেষত্ব আমার মনে নেই। তবে আরও সাম্প্রতিক অ্যাপ্লিকেশনটির জন্য, ডেট.নো ব্যবহার করার সময় () আমি আর জাম্প করতে দেখছি না।
কলিন ডুমিত্রু

উত্তর:


173

তারিখ.নউ () চেষ্টা করুন ।

এড়িয়ে যাওয়া সম্ভবত আবর্জনা সংগ্রহের কারণে। সাধারণত জঞ্জাল সংগ্রহ যথাসম্ভব ভেরিয়েবলগুলি পুনরায় ব্যবহার করে এড়ানো যায় তবে আপনি আবর্জনা সংগ্রহ বিরতি কমাতে কোন পদ্ধতি ব্যবহার করতে পারেন তা আমি বিশেষভাবে বলতে পারি না।


1
আমি ডেট.নো () ব্যবহার করার চেষ্টা করেছি, তবে এখনও আমার কাছে একই লাফ রয়েছে। সুতরাং এখন আমি বেশ নিশ্চিত যে এটি আবর্জনা সংগ্রহের ক্ষেত্রে সমস্যা নয়, বরং তারিখের অবজেক্টের সাথে সঠিক মান পাওয়ার সময় একটি সীমাবদ্ধতা। যেমনটি আমি বলেছিলাম, ডেল্টা সময়কে প্রতিস্থাপনের সাথে ধ্রুবক মান সহ মসৃণ অ্যানিমেশন / ট্রানজিশনগুলি প্রতিস্থাপন করা হয়, সুতরাং কেবলমাত্র আবর্জনা সংগ্রহই হ'ল "নতুন তারিখ" বা "তারিখ.নো ()" দিয়ে থাকে (যদি এই ফাংশনটি তার নিজস্ব অবজেক্টগুলি ইনস্ট্যান্ট করে দেয় যা আমি সম্পর্কে জানি না)।
কলিন ডুমিত্রু

22
কেবলমাত্র শীর্ষস্থানগুলি: এটি আইই 8 এবং এর নীচে কাজ করে না
নিক

1
আমি করি: / আমি চাই সমস্ত এমএসে তারিখ in এত প্রয়োজনীয় কিছু জন্য এত জটিল বলে মনে হচ্ছে।
ড্যামিয়েন গোল্ডিং

5
@ প্রোজি +1 .. আইই সত্যিই চুষে যায়, যখন আমি ওয়েব প্রোগ্রামিং করি আমি আসলে আইই, কেবল ক্রোম এবং ফায়ারফক্সের যত্ন করি না ..........
টেকলাইফ

3
@ টেকলাইফ আপনারও উচিত অ্যান্ড্রয়েড, সাফারি এবং অপেরা ব্রাউজারগুলিকে চিন্তাভাবনার এক লাইন দেওয়া, তবে আমি সম্মত হচ্ছি যে IE একটি আবর্জনা। আমার অর্থ এটি এত খারাপ যে এমএস ছেড়ে দিয়েছে এবং
ডাব্লু

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
দুর্ভাগ্যক্রমে বোকা পুরানো ব্রাউজারগুলিতেও কাজ করে না। ভাগ্যক্রমে, আমি আমার ক্লায়েন্টদের আমি যে সময় আমি আই 7 এবং আইই 8 সমর্থন করা নষ্ট করছি তার জন্য আমাকে অর্থ প্রদান করতে রাজি করিয়েছি।
মাইকেল শ্যাপার

2
|| ফাংশন () {নতুন তারিখ আসতে () getTime ()।}
MMM

2
লক্ষণীয় যে performance.now()মনোটোনিক সময় দেয়, সময়ের থেকে ভিন্ন Date। এর অর্থ হ'ল পরবর্তী প্রতিটি কল পূর্ববর্তীটির চেয়ে কম নয় এমন কোনও মান ফেরত দেওয়ার গ্যারান্টিযুক্ত।
ব্যবহারকারী

48

যতদূর আমি জানি আপনি কেবল তারিখের সাথে সময় পেতে পারেন ।

ডেট.নো হ'ল সমাধান তবে সর্বত্র উপলভ্য নয়: https://developer.mozilla.org/en/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / তারিখ / এখন ।

var currentTime = +new Date();

এটি আপনাকে মিলিসেকেন্ডে বর্তমান সময় দেয়।

আপনার জন্য জাম্প । আপনি যদি ডেল্টা ফ্রেমের সময়ানুসারে ইন্টারপোলেশনগুলি সঠিকভাবে গণনা করেন এবং আপনার কোনও গোলাকার সংখ্যার ত্রুটি না থাকে তবে আমি আবর্জনা সংগ্রহকারী (জিসি) এর জন্য বাজি ধরছি।

যদি আপনার লুপটিতে প্রচুর অস্থায়ী বস্তু তৈরি হয় তবে আবর্জনা সংগ্রহের জন্য কিছু সাফাই এবং মেমরি পুনরায় সংগঠিত করতে থ্রেডটি লক করতে হবে।

Chrome এর সাহায্যে আপনি দেখতে পাবেন যে জিসি টাইমলাইন প্যানেলে কত সময় ব্যয় করছে ।

সম্পাদনা: যেহেতু আমার উত্তরটিকে Date.now()সর্বোত্তম বিকল্প হিসাবে বিবেচনা করা উচিত কারণ এটি সর্বত্র এবং আইই> = 9 তে সমর্থিত।


4
কোন ফাংশন +পরিবেশন করা হয় +new?
অ্যান্ড্রু Scagnelli

33
+কেবল নিক্ষেপ Dateকরতে Number, মিলিসেকেন্ডে একটি প্রমিত UNIX টাইমস্ট্যাম্প দেয়। আপনি স্পষ্টভাবে কল করে এই মানটি পেতে পারেন(new Date()).getTime()
ngryman

9
@ মিকেনেলসন: আমার পক্ষে ভয়াবহ নয়, যখন আপনি জানেন যে কীভাবে জবরদস্তি কাজ করে this এই কথাটি বলেছিলেন, Date.now()এখন সমর্থনটি যথেষ্ট বেশি হওয়ায় এটি এখন পছন্দসই ।
ngryman

1
আমি কেবল তার +চেয়ে বেশি পছন্দ করি .getTime()... এটি সহজ এবং আমার ফাংশন নাম মুখস্ত করার দরকার নেই

2
@ ট্রাভিসজে দুর্দান্ত শর্টকাট? ইতিমধ্যে আপনার কম্পিউটারের ভিতরে থাকা একটি সংখ্যাসূচক মানটি পুনরুদ্ধার করতে আপনি কোনও অবজেক্ট তৈরি করেছেন, এমন কোনও অপারেটরকে কল করুন যা কোনও ইন্টার্নের জন্য পরীক্ষা করে এমন রূপান্তরকে ট্রিগার করে যা কোনও ফাংশনকে কল করে (valueOf) যা ক্লাস রূপান্তর পদ্ধতিতে কল করে যে ফাংশনকে (getTime) কল করে যা শেষ পর্যন্ত মানটি পুনরুদ্ধার করে। তারপরে অবজেক্টটি তার গন্তব্যে ছেড়ে দেওয়া হবে এবং লুপের 1000 পুনরাবৃত্তির পরে আপনার 1000 টি মুছে ফেলা হবে তারিখের অবজেক্টগুলি সেখানে ঝুলন্ত আবর্জনা সংগ্রহের প্রয়োজন যা হঠাৎ করে সমস্ত একসাথে ডাম্প হয়ে যায়, এবং আপনার কম্পিউটারে পিছিয়ে যাওয়ার পরে আপনি কী ভাবছেন তা অবাক করে দেন। :) অসাধারণ!
ফ্রান্সেসকোএমএম

7

আপনার যদি ডেট অবজেক্ট থাকে

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

তারপরে জাভাস্ক্রিপ্টে ইনবিল্ট পদ্ধতি রয়েছে মিলি সেকেন্ডের ফর্ম্যাটে তারিখ পাওয়ার জন্য যা মান হয় ()

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

2

এটি একটি খুব পুরানো প্রশ্ন - তবে এখনও রেফারেন্সের জন্য যদি অন্যরা এটি দেখছে - requestAnimationFrame()আধুনিক ব্রাউজারগুলিতে অ্যানিমেশন হ্যান্ডেল করার সঠিক উপায়:

আপডেট: মোজিলা লিঙ্কটি কীভাবে এটি করবে তা দেখায় - লিঙ্কটির পিছনে লেখাটি পুনরাবৃত্তি করা আমার মনে হয়নি;)


4
স্ট্যাক ওভারফ্লোতে স্বাগতম ! requestAnimationFrameপ্রশ্নটিতে বর্ণিত হিসাবে এই "জাম্পিং" বন্ধ করে দেয় কী করে তার একটি সংক্ষিপ্ত ব্যাখ্যা আপনি অন্তর্ভুক্ত করতে চাইতে পারেন । ধন্যবাদ!
কোয়ান্টাস 94 ভারী

2
এমনকি অনুরোধঅ্যানিমেশন ফ্রেম সহ আমরা সমস্ত প্ল্যাটফর্মগুলিতে ফ্রেম রেট একইরূপে ধরে নেওয়া বোঝাতে চাইনি, সুতরাং আমাদের এখনও বর্তমান সময়টি পরীক্ষা করা দরকার।
টম বাটেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.