स्थिति में बदलाव और ड्रॉइंग को अलग रखें
अगला दृश्य अपडेट करने के लिए requestAnimationFrame का उपयोग करें और उसका टाइमस्टैम्प छोटे लूप समन्वयक को दें। बीते समय के आधार पर स्थिति, टाइमर और नियम अपडेट करें, फिर वर्तमान स्थिति ड्रॉ करें। रेंडरर को यह तय नहीं करना चाहिए कि टक्कर हुई या नहीं; टक्कर की जाँच इस बात पर निर्भर नहीं होनी चाहिए कि स्प्राइट वास्तव में ड्रॉ हुआ था या नहीं।
एक छोटे प्लेटफ़ॉर्म परीक्षण में मार्कर को चुनी हुई विश्व-इकाइयाँ प्रति सेकंड की गति से क्षैतिज रूप से चलाएँ। वही रास्ता 60 Hz और उच्च रिफ़्रेश-दर वाले डिस्प्ले पर चलाएँ। यदि समान वास्तविक समय में मार्कर एक डिस्प्ले पर अधिक दूरी तय करता है, तो गति का कुछ हिस्सा अभी भी हर कॉलबैक पर लागू हो रहा है, समय की हर इकाई पर नहीं।
विलंबित फ़्रेमों के लिए पुनर्प्राप्ति नीति चुनें
लंबे ठहराव से बीते समय का बहुत बड़ा अंतर आ सकता है। सामान्य रीयल-टाइम गेम में इस अंतर को सीमित करें, ताकि लौटने पर खिलाड़ी पात्र को कई बाधाओं के पार टेलीपोर्ट होते न देखें। नियतात्मक सिमुलेशन में संचायक के साथ निश्चित अपडेट चरण अपनाएँ, समय की भरपाई करने वाले अपडेट की संख्या सीमित रखें और जहाँ इंटरपोलेशन उपयोगी हो वहाँ सिमुलेशन स्थितियों के बीच ड्रॉ करें।
दोहराए जा सकने वाले बाधा-कोर्स में कॉलबैक के बीच का सबसे लंबा अंतर रिकॉर्ड करें। फिर किसी दूसरे पेज पर जाकर लौटने के बाद गेम की जाँच करें। स्पष्ट रूप से तय करें कि गेम रुके, थोड़ा समय पूरा करे या पिछली स्थिति से जारी हो; एक देर से आए फ़्रेम को यह फैसला न करने दें।
ब्राउज़र गेम लूप से जुड़े सवाल
क्या ड्रॉइंग के लिए setInterval का उपयोग करना चाहिए?
विज़ुअल कार्य के लिए requestAnimationFrame का उपयोग करें क्योंकि इसे पुन: पेंट करने के लिए शेड्यूल किया गया है और आमतौर पर छिपे हुए दस्तावेज़ों के लिए इसे रोक दिया जाता है। एक टाइमर अभी भी गैर-दृश्य कार्यों को शेड्यूल कर सकता है, लेकिन इसे डिस्प्ले घड़ी के रूप में नहीं माना जाना चाहिए।
फ़्रेम टाइमस्टैम्प कहाँ से आता है?
requestAnimationFrame कॉलबैक उच्च-रिज़ॉल्यूशन टाइमस्टैम्प देता है। MDN इसके समय-निर्धारण और एक बार चलने वाले व्यवहार का वर्णन करता है। कॉलबैक गिनने के बजाय प्रगति की गणना इस टाइमस्टैम्प से करें।
आगे पढ़ें
कोई पुरानी जानकारी दिखी? सुधार की जानकारी दें