דרך טובה יותר לקבלת זמן במילישניות ב-JavaScript?
האם יש אלטרנטיבה ב-JavaScript לקבלת זמן במילישניות באמצעות אובייקט התאריך, או לפחות דרך להשתמש שוב באותו אובייקט, מבלי ליצור אובייקט חדש בכל פעם שאני צריך לקבל ערך זה? אני שואל את זה כי אני מנסה ליצור מנוע משחק פשוט ב-JavaScript, וכאשר אני מחשב את "זמן הפריים הדלתא", אני חייב ליצור אובייקט Date חדש בכל פריים. בזמן שאינני מודאג יותר מדי מההשלכות על הביצועים של זה, אני נתקל בבעיות באמינות של הזמן המדויק שמוחזר על ידי אובייקט זה.
אני מקבל סוג מסוים של "קפיצות" באנימציה, כל שנייה בערך, ואני לא בטוח אם זה קשור לאיסוף הזבל של JavaScript או למגבלה של אובייקט Date כאשר מעדכנים כל כך מהר. אם אני מגדיר את ערך הדלתא לקבוע מסוים, אז האנימציה חלקה בצורה מושלמת, אז אני די בטוח שה"קפיצות" האלה קשורות לאופן שבו אני מקבל את הזמן.
הקוד הרלוונטי היחיד שאני יכול לתת הוא הדרך שבה אני מחשב את זמן הדלתא:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
כשמחושבת תנועה/אנימציה אני מכפיל ערך קבוע בזמן דלתא.
אם אין דרך להימנע מלקבל את הזמן במילישניות על ידי שימוש באובייקט Date, האם פונקציה שמגדילה משתנה (שהוא הזמן שחלף במילישניות מאז תחילת המשחק), ונקראת באמצעות פונקציית SetTimer בקצב של פעם בכל מילישנייה תהיה אלטרנטיבה יעילה ואמינה?
עריכה: אני בדקתי עכשיו את הקוד שלי בדפדפנים שונים ונראה שה'הקפצה' הזו קיימת רק ב-Chrome, לא ב-Firefox. אבל עדיין יהיה נחמד אם היה שיטה שעובדת בשני הדפדפנים.
תשובה #1
נסה את Date.now().
הקפיצה היא ככל הנראה בגלל איסוף פסולת. בדרך כלל ניתן להימנע מאיסוף פסולת על ידי שימוש חוזר במשתנים ככל האפשר, אבל אני לא יכול לומר במדויק אילו שיטות ניתן להשתמש כדי להפחית עצירות של איסוף פסולת.
תשובה #2
למיטב ידיעתי, אתה יכול לקבוע זמן רק עם Date.
Date.now הוא הפתרון אך אינו זמין בכל מקום: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now.
var currentTime = +new Date();
זה נותן לך את הזמן הנוכחי במילישניות.
בשביל ה-קפיצות שלך. אם אתה מחשב את ה-אינטרפולציות נכון לפי זמן המסגרת הדלטה ואם אין לך איזו שגיאת עיגול מספרית, אני מהמר על אוסף הזבל (GC).
אם יש הרבה אובייקטים זמניים שנוצרים בלולאה שלך, איסוף הזבל צריך לנעול את התהליך כדי לבצע קצת ניקוי וארגון מחדש של הזיכרון.
עם כרום אתה יכול לראות כמה זמן ה-GC מבלה בלוח Timeline.
עריכה: מאז תשובתי, Date.now() צריך להיחשב כאפשרות הטובה ביותר כיוון שהוא נתמך בכל מקום וב-IE >= 9.
תשובה #3
אני יודע שזה דיון די ישן, אבל כדי לשמור על הדברים מעודכנים ורלוונטיים יותר, אתה יכול להשתמש בפונקציונליות המדויקת יותר performance.now() כדי לקבל דיווחי זמן מדויקים יותר ב-JavaScript.
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 */
})();
תשובה #4
אם יש לך אובייקט תאריך כמו
var date = new Date('2017/12/03');
אז יש שיטה מובנית ב-JavaScript לקבלת תאריך בפורמט מילישניות שהיא valueOf()
date.valueOf(); //1512239400000 in milliseconds format
