2011-01-28 21 views
5

रोकता है मैं वेबग्ल के साथ जावास्क्रिप्ट में एक साधारण गेम इंजन बनाने की कोशिश कर रहा हूं, लेकिन मुझे सामान्य रूप से जावास्क्रिप्ट के साथ कुछ अवांछित समस्याएं आ रही हैं, जिन्हें मैं टाला जा सकता हूं। जावास्क्रिप्ट के साथ प्रदर्शन की कुल कमी के अलावा, वेबग्ल के साथ प्रतिपादन करते समय मुझे कुछ अजीब विराम मिलते हैं, जो समय-समय पर होता है, हर बार या तो एक बार। मुझे लगता है कि यह जावास्क्रिप्ट में जीसी के साथ होना है। क्या इन "स्टटर" को कम करने के लिए वैसे भी है? क्या किसी भी सामान्य प्रथाओं को मुझे पता होना चाहिए, कचरा संग्रह का कम से कम हिस्सा, बल देने का एक तरीका, जिस समय मैं नियंत्रण कर सकता हूं?जावास्क्रिप्ट कचरा संग्रह

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

+2

बेशक यह * जीसी हो सकता है, लेकिन मेरे अनुभव में, हमेशा जब हमने कुछ के लिए जीसी को दोषी ठहराया, तो यह पता चला कि कोड में कहीं हमारी सामान्य गलती थी। – Boldewyn

+0

अपने ब्राउज़र के प्रोफाइलिंग टूल का उपयोग करें! जैसा कि @ बोल्डविन ने सुझाव दिया है, समस्या वास्तव में जीसी नहीं हो सकती है। समय-समय पर अनुकूलित करने से अक्सर अनावश्यक जटिल कोड हो सकता है, लेकिन किसी भी प्रोफाइलिंग मीट्रिक के बिना अनुकूलित करने से शायद जटिल कोड * और * वास्तव में प्रदर्शन में सुधार भी नहीं हो सकता है। – namuol

उत्तर

2

वस्तुओं को जितनी बार संभव हो पुन: उपयोग करें। यदि आप प्रत्येक प्रस्तुत फ्रेम के लिए दर्जनों ऑब्जेक्ट्स (वैक्टर और मैट्रिस जैसे) बना रहे हैं तो आपको निश्चित रूप से जीसी से संबंधित स्टटरिंग प्राप्त होगी। तो जब आप अपने गेम को प्रस्तुत करने के लिए दृश्य-ग्राफ़ आधारित दृष्टिकोण का उपयोग कर रहे हैं तो आप उदाहरण के लिए दृश्य ग्राफ़ नोड्स में ऑब्जेक्ट कैश करना चाहेंगे। या आप Object Pool Pattern का उपयोग कर सकते हैं। जावा जैसी अन्य भाषाओं में इस तकनीक को बहिष्कृत किया गया है क्योंकि वस्तु निर्माण और जीसी आज इतनी तेज़ है कि ऑब्जेक्ट पूल अब और मदद नहीं करता है। लेकिन जावास्क्रिप्ट में यह अभी भी मदद कर सकता है।

मेरे पास पिछले साल लिखा गया एक जावास्क्रिप्ट गेम में जीसी-स्टटर-समस्याएं थीं और मैंने इसे अपने 2 डी वेक्टर इंजन को फिर से लिखकर हल किया ताकि बिल्कुल फ्रेम प्रतिपादन के दौरान कोई नई वस्तुएं न बनाई जाए। ऑब्जेक्ट केवल तभी बनाए जाते हैं जब दृश्य बिल्ड-अप हो या नए दृश्य नोड्स जोड़े जाए। लेकिन दृश्य को प्रदर्शित और एनिमेट करने से पूरी तरह से कोई नई वस्तुएं नहीं बनती हैं।

तुम मेरे 2 डी इंजन पर एक नज़र लेने के लिए चाहते हो सकता है:

http://www.ailis.de/~k/hg/javascript/twodee/file/tip/src/main/javascript/twodee

आप देखेंगे कि मैं स्थिर क्षेत्रों में अस्थायी रूप से की जरूरत वैक्टर और मैट्रिक्स कैश और मैं परिवर्तनशील वेक्टर और मैट्रिक्स कक्षाएं बजाय प्रयोग किया है कि अपरिवर्तनीय ऐसे मौजूदा वैक्टर/मैट्रिस को उनके साथ गणित करते समय नए परिणाम वैक्टर/मैट्रिस बनाने के बजाय संशोधित किया जाता है।

संबंधित मुद्दे