2010-05-06 16 views
7

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

http://set.rentfox.net/

अब जावास्क्रिप्ट टाइमर कुछ मैं बड़े पैमाने पर इस्तेमाल नहीं किया है, लेकिन से मैं क्या पता है, मुझे ठीक कर लें मैं गलत हूँ, एक ही समय वास्तव में अच्छी तरह से काम नहीं करता पर हो कई setIntervals होने कि है बी/सी यह सब एक धागे पर है।

आइए कहें कि मैं सेट इंटरवल के साथ स्प्राइट पृष्ठभूमि पोजिशनिंग का उपयोग करके एक राक्षस पर फायरबॉल को 10 अलग-अलग लोगों को नियुक्त करना चाहता था - उस एनीमेशन को 10 सेट इंटरवल्स की आवश्यकता होती है जो स्पॉट पृष्ठभूमि-स्थिति शिफ्ट के लिए डोम की मरम्मत कर रही है। क्या यह एक बड़ी छोटी गाड़ी नहीं होगी?

मैं सोच रहा था कि कैनवास का उपयोग करके, इस सब के आसपास कोई रास्ता था, ताकि एनिमेशन सभी घटना कतार के बिना समवर्ती रूप से हो सकें और मुझे टाइमर के बारे में चिंता करने की आवश्यकता नहीं है।

आशा है कि समझ में आता है, और अगर मुझे आगे स्पष्टीकरण की आवश्यकता है तो कृपया मुझे बताएं।

+2

मैं केवल एक सेट इंटरवल/सेटटाइमआउट-लूप का उपयोग करने और वहां सबकुछ संभालने का सुझाव देना चाहता हूं। – RoToRa

उत्तर

11

एकाधिक setInterval एस के साथ समस्या दो गुना है। पहला जैसा कि आप इंगित करते हैं, चूंकि ब्राउज़र पर सभी जावास्क्रिप्ट (वर्तमान में) सिंगल-थ्रेडेड है, एक टाइमर का निष्पादन अगले टाइमर के निष्पादन को रोक सकता है। (Worker threads आ रहे हैं, हालांकि; फ़ायरफ़ॉक्स already has them, जैसा कि सफारी 4 [और शायद अन्य] करता है।) दूसरा यह है कि टाइमर एक सेट अंतराल पर होता है, लेकिन यदि आपका अंतराल तब भी चल रहा है जब अंतराल समाप्त हो जाता है, तो दूसरा अंतराल पूरी तरह से होता है को छोड़ दिया। उदा।, टाइमर खुद में हस्तक्षेप कर सकता है।

उस अंतिम भाग को और स्पष्टीकरण की आवश्यकता है: मान लें कि आपके पास 10ms पर एक सेट इंटरवल है (जो सबसे तेज़ है, आप इसे करने के लिए किसी भी कार्यान्वयन की अपेक्षा कर सकते हैं; क्लैंप हो सकता है ताकि वे उससे तेज न हों)। यदि आपका हैंडलर 13 एमएमएस लेता है, तो अंतराल जो शुरू होने के बाद 10ms हो गया होगा उसे पूरी तरह से छोड़ दिया जाएगा।

मैं आमतौर पर इस तरह की चीज़ के लिए setTimeout का उपयोग करता हूं। जब मेरा हैंडलर ट्रिगर होता है, तो मैं अपना काम करता हूं और फिर अगले ईवेंट को हैंडलर के अंत में शेड्यूल करता हूं। फिर ( के कुछ सीमाओं के भीतर), मुझे पता है कि अगली घटना उस अंतराल पर होगी।

आप जो कर रहे हैं, उसके लिए ऐसा लगता है कि यह एक "पल्स" टाइमर सबसे अच्छा होगा, जो इसे नाड़ी पर करने की ज़रूरत है। चाहे वह नाड़ी टाइमर setInterval या setTimeout का उपयोग करता है, जो आप अपने वास्तविक कोड के साथ देख रहे हैं उसके आधार पर एक निर्णय कॉल है।

+0

"पल्स" टाइमर द्वारा आपका क्या मतलब है, क्या इस तकनीक पर कोई पढ़ाई है? – resopollution

+1

@resopollution: मेरा मतलब सिर्फ एक टाइमर है जिसका उपयोग आप अपने ऐप को नाड़ी (उदाहरण के लिए, दिल की धड़कन) प्रदान करने के लिए करते हैं। तो एक एकल टाइमर जो एकाधिक वर्णों के लिए काम करता है (चाहे वह टाइमर 'setInterval' या' setTimeout') का उपयोग करता हो। स्पष्टीकरण के लिए –

+0

धन्यवाद – resopollution

3

+1 टी जे क्रॉउडर के लिए, जवाब सही था। मैं दृढ़ता से गेम एनीमेशन के लिए डीओएम नोड्स पर कैनवास का उपयोग करने के लिए सीखने की सलाह देता हूं; उत्तरार्द्ध धीमा और छोटी है, और ब्राउज़र को किसी भी गैर-तुच्छ स्थिति में लटका देगा। ओटीओएच, कैनवास बहुत तेज़ है और हार्डवेयर तेज हो सकता है, और यदि आपको इसकी आवश्यकता हो तो 3 डी संदर्भ भी हो सकता है।