2012-03-05 8 views
6

मैंने एक HTML5 गेम बनाया जिसमें कई छोटे स्तर शामिल हैं। जब खिलाड़ी दरवाजे तक पहुंच जाता है, तो दूसरा स्तर लोड होता है। जब एक स्तर यह लोड कर रहा है मूल रूप से सिर्फ [] करने के लिए सभी उदाहरण सरणियों सेट और फिर उन्हें में सामान धक्का, चीजों की नई उदाहरणों बनाने के द्वारा, उदाहरण के लिए:जावास्क्रिप्ट में, क्या मुझे एक नया लोड करने के बाद पिछले स्तर के उदाहरणों को हटा देना चाहिए?

enemies = [] //this has previously been full of pointers from the old level 
for (i = 0; i < n_enemies; i ++) 
    enemies.push(new Enemy()); 

लेकिन, यह मेरे ध्यान में आया है कि केवल स्थापित करने [] पर पॉइंटर्स से भरा एक सरणी, वास्तव में उदाहरणों को हटा नहीं देती है! तो, क्या जावास्क्रिप्ट स्वचालित रूप से ऐसा करता है? या क्या मुझे प्रत्येक उदाहरण को delete करना है?

उत्तर

3

यदि सरणी में मौजूद वस्तुओं को अब कहीं से संदर्भित नहीं किया गया है तो वे कचरा एकत्र होंगे। ऐसा कोई विनिर्देश नहीं है जो कहता है कि यह कब होगा, लेकिन यह उन्हें ऐरे से हटाने के तुरंत बाद होना चाहिए।

यह स्मृति रिसाव प्रस्तुत नहीं करना चाहिए।

+2

इसके अलावा 'हटाएं' केवल ऑब्जेक्ट्स के गुणों के लिए परिभाषित किया गया है, इसलिए जावास्क्रिप्ट में सरणी चर को हटाने का कोई तरीका भी नहीं है - आपको बस यह मानना ​​होगा कि जेएस इंजन सभी संदर्भों को हटा दिए जाने के बाद कचरा संग्रह का ख्याल रखेगा। – wheresrhys

+0

wheresrhys - ऐरे सदस्य संख्यात्मक नामों के साथ केवल गुण हैं। उन पर काम हटाएं (उदा। 'सरणी हटाएं [' 0 ']' शून्य से शुरू होने वाले सरणी के पहले सदस्य को हटा देता है), लेकिन जैसा कि जिविंग्स कहते हैं, यह अनावश्यक है। – RobG

+0

@RobG - मुझे शायद स्पष्ट होना चाहिए - "सरणी चर" से मेरा मतलब है कि वेरिएबल वेरे हैं जो सरणी में संग्रहीत आदिम मूल्यों के बजाय सरणी हैं। – wheresrhys

1

यह किसी भी अन्य प्रोग्रामिंग भाषा की तरह है। यदि ऑब्जेक्ट का संदर्भ है तो इसे हटाया नहीं जाएगा।

उदा।

enemies = []; 
enemy = new Enemy(); 
enemies.push(enemy); 
enemies = []; 

मामले में आप एक संदर्भ दुश्मनों को खाली करने के बाद आपत्ति उठाने का निर्माण नहीं करतीं, दुश्मन वस्तु भी हटा दिया जाएगा

enemies.push(new Enemy()); 
+0

* कोई अन्य ** कचरा एकत्रित ** प्रोग्रामिंग भाषा। यदि आप गैर-जीसीएड भाषा में काम कर रहे हैं, तो आपको स्मृति आवंटन को संभालने की आवश्यकता होगी। – Davy8

2

मैं विकासशील खेल के बारे में ज्यादा नहीं जानता लेकिन जावास्क्रिप्ट में सामान्य रूप से समाशोधन सरणी से किया जाता है इस तरह, और यह अच्छा अभ्यास है

enemies.length = 0; 

जांच इस post

+0

+1 यह सरणी को '[] 'पर सेट करने के समान ही काम करता है। – Jivings

+0

मैंने इससे पहले कभी नहीं सुना है। ऐसा लगता है कि काम (बस क्रोम में परीक्षण किया गया) लेकिन इसका कोई अच्छा अभ्यास अच्छा संदर्भ है? – Davy8

+0

ठीक है, लेकिन मेरा मानना ​​है कि यह एक टिप्पणी होनी चाहिए, क्योंकि यह सीधे सवाल का जवाब नहीं देती है। धन्यवाद। मैंने क्रोम में भी इसका परीक्षण किया, यह काम करता है, लेकिन मैंने इसे कहीं भी नहीं पढ़ा। यदि यह "सही" तरीका है, तो इसके बारे में और लोग क्यों बात नहीं कर रहे हैं? – corazza

1

जावास्क्रिप्ट में कोई free कमांड नहीं है, इसलिए आप वास्तव में किसी भी स्मृति को "मुक्त" नहीं कर सकते हैं। आप बस इतना कर सकते हैं: किसी ऑब्जेक्ट पर सभी संदर्भ (पॉइंटर्स) को मार दें। आखिरकार, कचरा कलेक्टर उन वस्तुओं की तलाश करेगा जो अब किसी के लिए दृश्यमान नहीं हैं।

या इसके बजाय: जीसी अंततः सभी स्मृति एकत्र करेगा जो अभी भी पहुंचा जा सकता है और बाकी के बारे में भूल जाता है। यही कारण है कि जीसी पर्यावरण में केवल जीवित वस्तुओं की लागत होती है।

लेकिन एक पकड़ है: जीसी वस्तुओं को नहीं बताती है कि वे मर चुके हैं। तो यदि आपके दुश्मन वस्तु को कुछ सफाई की आवश्यकता है, तो आपको इसे मैन्युअल रूप से करना होगा।

+0

नहीं है? मुझे पूरा यकीन है कि यह एक कीवर्ड है और मैंने इसे कहीं और पढ़ा है! सभी उपयोगी जानकारी के लिए +1। – corazza

+1

@ बेन [डिलीट ऑपरेटर] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/delete) – Jivings

+0

आह! यह बहुत साफ हो गया। – corazza

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

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