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


25

मैंने इस पैटर्न के बारे में कई बार पढ़ा है (सर्वोत्तम प्रथाओं के नजरिए से):

मेमोरी एलोकेशन : फ्लाई पर नई ऑब्जेक्ट को इंस्टेंट करने के बजाय, हमेशा ऑब्जेक्ट पूल बनाने और उपयोग करने पर विचार करें। यह स्मृति विखंडन को कम करने और कचरा संग्रहकर्ता को कम काम करने में मदद करेगा।

हालाँकि, मुझे नहीं पता कि इसका वास्तव में क्या मतलब है। मैं इसे कैसे लागू कर सकता हूं?

उदाहरण के लिए, मैं एकता GameObjectकी Instantiateविधि का उपयोग करके तुरंत कर सकता हूं ?

Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity);

क्या यह उपयोग हतोत्साहित करता है? इसका और क्या मतलब हो सकता है?



धन्यवाद Hellium मैं दिए गए वीडियो (बहुत बड़ा) नहीं देखा, लेकिन पाठ वास्तव में मुझे समझने में मदद करता है "त्वरित और नष्ट करने का कार्य अक्षम है और आपकी परियोजनाओं को धीमा कर सकता है"
मुहम्मद फैजान खान

1
ध्यान दें कि जबकि यह सलाह आम है, यह हर खेल के लिए एक परम आवश्यकता नहीं है। खासकर यदि आप एक छोटा / छोटा डेस्कटॉप गेम, जैम सबमिशन या प्रोटोटाइप बना रहे हैं, तो आपको पूलिंग को लागू करने के लिए अपने रास्ते से हटने की जरूरत नहीं है। मेरे सोख परीक्षणों में एकता और भी बड़े पैमाने पर फैलने और नष्ट होने से बेहतर है कि हम इसका श्रेय दें। ;) लेकिन आप पूलिंग पर विचार करें यदि आप एक लंबा गेम बना रहे हैं जहाँ आप कचरा नहीं डालना चाहते हैं और बाद में एकत्र होने पर हकलाने का कारण बनते हैं, या यदि आप मोबाइल प्लेटफ़ॉर्म को लक्षित कर रहे हैं जहां किसी भी प्रदर्शन प्रभाव को अधिक उत्सुकता से महसूस किया जाता है।
DMGregory

धन्यवाद @DMGregory आप सही हैं। आपका इनपुट हमेशा मूल्यवान है। हमें छोटे खेलों में ऑब्जेक्ट पूलिंग के बारे में चिंता नहीं करनी चाहिए क्योंकि इसे कोडिंग में अतिरिक्त काम की आवश्यकता होगी।
मुहम्मद फैज़ान खान

1
यह एक बहुत ही सामान्य पैटर्न है, लेकिन नियम के साथ इसे गुस्सा करना सुनिश्चित करें: "पहले प्रोफ़ाइल, फिर अनुकूलन करें।" यह आसान नहीं है कि चीजों को अनुकूलित करने के लिए।
कोरट अमोन -

जवाबों:


41

यदि आप एक ही प्रीफ़ैब के कई उदाहरणों को तुरंत करने की योजना बना रहे हैं, तो आपको निश्चित रूप से ऑब्जेक्ट पूलिंग का उपयोग करने के बारे में सोचना चाहिए। यूनिटी के इंस्टेंटिअट फंक्शन को कॉल करना आपके द्वारा किए जा सकने वाले सबसे अधिक कर तरीकों में से एक है।

ऑब्जेक्ट पूलिंग तब होती है जब आप उपयोग किए जाने से पहले प्रीफ़ैब्स को इंस्टेंट करते हैं। वे तत्काल पर निष्क्रिय कर दिए जाते हैं और केवल तब ही सक्रिय होते हैं जब उनकी आवश्यकता होती है। जबकि यह मेमोरी उपयोग को बढ़ाता है, यह गेमप्ले के दौरान सीपीयू के तत्काल ओवरहेटिंग से बचा जाता है।

उदाहरण के लिए, मैं वर्तमान में एक बुलेट नरक गेम पर काम कर रहा हूं जिसके लिए रनटाइम पर सैकड़ों बुलेट की आवश्यकता होती है। मैंने शुरू में ऑब्जेक्ट पूलिंग के बिना खेल बनाने की कोशिश की लेकिन यह एक आपदा (2 एफपीएस से कम) होने के कारण समाप्त हो गया। अब, मैं खेल शुरू होने से पहले 500 गोलियां चलाता हूं और खेल आश्चर्यजनक रूप से तेज (200 एफपीएस) चलता है।

ऐसी परिस्थितियाँ हैं जहाँ ऑब्जेक्ट पूलिंग का उपयोग नहीं किया जा सकता है। उदाहरण के लिए, यदि आपके पास एक गेम है जहां खिलाड़ी इनपुट निर्धारित करता है कि प्रीफैब क्या है, तो आपके पास सामान्य इंस्टेंटेज कॉल का उपयोग करने के अलावा कोई विकल्प नहीं हो सकता है। ऑब्जेक्ट पूलिंग केवल तभी संभव है जब आप समय से पहले यह जान लें कि किन वस्तुओं की आवश्यकता होगी।

सेबस्टियन लेग्यू का YouTube ट्यूटोरियल ऑब्जेक्ट पूलिंग के बारे में जानने के लिए एक महान संसाधन है: https://youtu.be/LhqP3EghQ-Q


"त्वरित करने और नष्ट करने का कार्य अक्षम है और आपकी परियोजनाओं को धीमा कर सकता है"। यही कारण है? तो इसका मतलब है कि हमें थोड़ा और कोड करना होगा (जैसे सक्रिय निष्क्रिय करें, या फिर से गोली की स्थिति निर्धारित करें ताकि हम फिर से आग लगा सकें)
मुहम्मद फैजान खान

12
यह बार-बार तात्कालिकता और विनाश की लागत के लिए प्रमुख योगदानकर्ता के रूप में आवंटन और कचरा संग्रह का उल्लेख करने योग्य हो सकता है। पर्याप्त कचरा उत्पन्न करें और अंततः पूरे खेल को कचरा इकट्ठा करने वाले के लिए इंतजार करना पड़ता है। ;)
DMGregory

3
@corsiKa जो कि 80 के दशक का अनुकूलन होगा। एकता सवाल में प्रीफैब को निष्क्रिय कर सकती है, जिससे उसके सिस्टम इसे अनदेखा कर सकते हैं।
कॉंग्सबोंगस

2
"उदाहरण के लिए, यदि आपके पास एक गेम है जहां खिलाड़ी इनपुट निर्धारित करता है कि प्रीफैब क्या है, तो आपके पास सामान्य इंस्टेंटिएट कॉल का उपयोग करने के अलावा कोई विकल्प नहीं हो सकता है।" - ज़रुरी नहीं। स्टार्टअप (या दृश्य भार) पर इच्छित आकारों के लिए आवंटित किए गए विभिन्न प्रीफैब्स के लिए आपके पास आसानी से कई ऑब्जेक्ट पूल हो सकते हैं। या, यदि कोई इसे बनाना चाहता था, तो कई प्रीफ़ैब प्रकारों को संग्रहित करने वाला ऑब्जेक्ट पूल भी काम कर सकता है।
एथन बेयरलीन

1
@DMGregory एक विशिष्ट जीसी वातावरण में, डी-आवंटन लागत का सबसे अधिक है; एक गैर-जीसी पर्यावरण में, आवंटन अधिकांश लागत है। ऑब्जेक्ट पूलिंग दोनों के लिए बहुत अच्छा काम करता है, वे वास्तव में अधिकांश भाग के लिए एक ही सिक्के के सिर्फ दो पक्ष हैं। चरम मामले में, पुराने गेम को सभी वस्तुओं के साथ लिखा जाता है, जो कि गेट-गो से "आवंटित" होता है - जब खेल चल रहा था तब बहुत कम या कोई मेमोरी डी / आवंटन नहीं था। आपने वास्तव में ऐसी किसी चीज़ का उपयोग नहीं किया, जो किसी तरह से "लयबद्ध" नहीं थी। चूंकि एकता बहुत वास्तविक समय "मेटाडेटा" का उपयोग करती है, इसलिए पूलिंग काफी मदद कर सकती है - हालांकि इसे लागू करने के लिए मुश्किल भी हो सकता है।
लुअन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.