खेल के विकास में उपयोग किए जाने वाले मेमोरी आवंटन पैटर्न


20

मैं अपने स्वयं के आवंटन के तरीकों को बनाने पर शोध कर रहा हूं (जो कि मेमोरी पूल और प्रोफाइलिंग जैसी चीजों का समर्थन करेगा), हालांकि, जैसा कि मैंने अपना शोध जारी रखा है, मैं देख रहा हूं कि यह खेल विकास में कैसे किया गया था।

मेमोरी मेमोरी तकनीक मैं क्या उपयोग कर सकता है, और यह एक अच्छी तकनीक क्यों है?


1
क्या आपको वास्तव में जरूरत है? यह सबसे जटिल चीजों में से एक है जिसे टीम कभी भी लागू कर सकती है, अगर वे इसे लागू कर सकते हैं।
अली

4
यह मेरे लिए रुचि का क्षेत्र है, इसलिए मैं इसके बारे में सीखना और इसे लागू करना
चाहूंगा

मुझे यह कहना चाहिए कि यह विषय वास्तव में दिलचस्प है ... ऐसे मामले हैं, जिनका अर्थ आवंटित किया जा सकता है, लेकिन आप औसत पीसी गेम पर नहीं, बल्कि वास्तविक गेम के बारे में चिंता करेंगे ...
rioki

क्या आपने आधुनिक मानक पुस्तकालय मॉलॉक और मुक्त या नए और हटाने के लिए स्रोत कोड पर शोध किया है? मैं पूछता हूं क्योंकि ऐसा लगता है कि एल्गोरिदम के खिलाफ या व्यावहारिक रूप से किसी भी वैकल्पिक आवंटन रणनीतियों की तुलना करने के लिए एक बहुत ही उपयोगी आधार प्रदान करेगा। लगता है कि यह भी आप क्या हो जाएगा में कुछ वास्तविक अंतर्दृष्टि प्रदान करेगा।
लुई लैंगहोल्त्ज़

जवाबों:


25

गेम इंजन आर्किटेक्चर को इस विषय से संबंधित कुछ जानकारी है। मूल बातें यह हैं कि आपको यह समझने के लिए कुछ विश्लेषण करने की आवश्यकता है कि आपकी स्मृति की आवश्यकता प्रति स्तर / फ्रेम / आदि क्या है। जैसे हैं, लेकिन कुछ पैटर्न हैं जिन्हें लेखक ने कई बार देखा है:

  • स्टैक-आधारित आवंटनकर्ता: ये एक बार मेमोरी का एक बड़ा सेगमेंट आवंटित करते हैं, और फिर गेम में कहीं और से अनुरोध के जवाब में मेमोरी के उस ब्लॉक के भीतर पॉइंटर्स आवंटित करते हैं। मेमोरी आवंटन के लिए आवश्यक संदर्भ स्विच से बचने के लिए यह उपयोगी है, और यह भी कि आप अपनी स्वयं की तकनीकों का उपयोग कर सकते हैं सन्दर्भ को लागू करने के लिए, या SIMD संचालन के लिए विशिष्ट संरेखण। कुछ इंजन डबल-एंडेड स्टैक का भी उपयोग करते हैं जहां एक प्रकार का संसाधन ऊपर से लोड किया जाता है और दूसरा नीचे से लोड किया जाता है। शायद एलएसआर (लोड और स्टे रेजिडेंट, ऊपर से आपके गेम की संपूर्णता के दौरान जिस तरह की चीज की आवश्यकता होगी) और नीचे से प्रति-स्तर डेटा।
  • सिंगल फ्रेम मेमोरी, या डबल-बफ़र्ड फ़्रेम मेमोरी: एक या दो फ्रेम साइकल के भीतर होने वाले ऑपरेशन के लिए मेमोरी। यह उपयोगी है क्योंकि प्रत्येक फ्रेम को आवंटित / डील करने के बजाय, आप ब्लॉक के शुरुआत में मेमोरी का ट्रैक रखने के लिए आपके द्वारा उपयोग किए जाने वाले पॉइंटर को रीसेट करके अंतिम फ्रेम के डेटा को उड़ा सकते हैं।
  • ऑब्जेक्ट पूल: कई समान आकार की वस्तुओं, जैसे कि कण, दुश्मन, प्रोजेक्टाइल के लिए मेमोरी का एक ब्लॉक। ये उपयोगी हैं क्योंकि आप अपने पूल में पहला अप्रयुक्त खंड ढूंढकर आसानी से आकस्मिकता प्राप्त कर सकते हैं। वे पुनरावृत्ति को भी आसान बनाते हैं, क्योंकि प्रत्येक वस्तु अंतिम से ज्ञात ऑफसेट पर होती है।

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

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


1

जो मैंने देखा है (लेकिन नहीं किया है) से प्रत्येक खेल या तो पिछले संस्करण (2010 -> 2011) से एक खेल इंजन से एक फ्रेमवर्क से आवंटन तंत्र को प्राप्त करने के लिए जाता है, या इसे विशेष रूप से इसके लिए लिखे गए नए लोगों का एक सेट मिलता है। संरचना (या तो जब डेटा संरचनाएं पुन: प्रयोज्य और निश्चित आकार या कई प्रकार और चर आकार की होती हैं)।

इसके अलावा, हमारे पास एक ही प्रोजेक्ट में स्तरों और अन्य गेम ऑब्जेक्ट्स की तुलना में ध्वनि फ़ाइलों / घटकों के लिए अलग-अलग आवंटन थे। अन्य परियोजनाओं में आवंटनकर्ता को केवल उस दायित्व द्वारा प्रबंधित घटकों के लिए बाहरी पुस्तकालयों से विरासत में मिला है।

अनुकूलन वास्तव में आपकी आवश्यकताओं पर निर्भर करता है। लेकिन आमतौर पर खेल के दृश्य में प्रवेश करने से पहले आवंटन किया जाता है और फिर मेमोरी का पुन: उपयोग किया जाता है। कुछ गेम बिना कस्टम एलोकेटर्स के छूट सकते हैं। लेकिन एक्शन गेम्स के लिए जहां प्रोसेसर, मेमोरी और डेटा रिसोर्सेस का बजट होता है, आप बड़े एलोकेशन पर प्रोसेसिंग का समय नहीं गंवा सकते, आप मेमोरी को विखंडन और अन्य समस्याओं के लिए बर्बाद नहीं कर सकते।

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


0

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

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

कस्टम आवंटनकर्ताओं का उपयोग करने का एकमात्र कारण CPU प्रदर्शन (मुख्य रूप से कैश सुसंगतता के लिए) और विखंडन को सीमित करना है। इसका एक आदर्श उदाहरण एक कण प्रणाली है। आप स्मृति में सभी कणों को सन्निहित चाहते हैं और आप बहुत सारे अल्पकालिक आवंटन के साथ मुख्य मेमोरी को काली मिर्च नहीं देना चाहते हैं। विभाजन के लिए एक और अच्छा उदाहरण एक पटकथा भाषा है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.