संपत्ति के लिए कस्टम मेमोरी प्रबंधन की आवश्यकता क्यों है?


10

गेम प्रोग्रामिंग से संबंधित बहुत सारे संसाधन, विशेष रूप से 3 डी ओपन-वर्ल्ड गेम्स, डिस्क और सिस्टम मेमोरी और वीडियो मेमोरी से आपके पास लगातार अनलोडिंग और पुन: लोड करने वाली संपत्ति कैसे होती है, इसके बारे में बात करते हैं। मैं इसे कंसोल पर समझ सकता हूं, क्योंकि उनके पास बहुत सरल मेमोरी प्रबंधन योजनाएं हैं जो किसी भी संभावित अतिप्रवाह से निपट नहीं सकती हैं।

हालांकि, पीसी पर, स्थिति बहुत अलग है। सिस्टम मेमोरी के लिए ओएस द्वारा प्रदान की गई वर्चुअल मेमोरी है और ग्राफिक्स ड्राइवर सीपीयू से GPU तक आगे और पीछे स्वैपिंग को हैंडल करता है। तो ऐसा क्यों है कि यह सब कुछ एक ही बार में लोड करने के लिए पर्याप्त नहीं है और केवल प्रीफेटिंग से निपटना है और संभवत: यह सुनिश्चित करना है कि आवश्यक संपत्ति की अदला-बदली नहीं हो रही है?


यह कहना नहीं है कि सब कुछ जैसे कुछ का उपयोग करके भोलेपन से आवंटित किया जा रहा है malloc। सब कुछ सन्निहित और कैश-सुसंगत रखा जाएगा। यकीनन आपकी मेमोरी एक्सेस को कुशल बनाना आसान है, अगर आपको मैन्युअल रूप से और वैसे भी पेजिंग के बारे में चिंता करने की ज़रूरत नहीं है ...


अपडेट करें:

अतुल्यकालिक बफर स्थानान्तरण में थोड़ा पढ़ने के बाद , मुझे यह विचार मिलता है कि ग्राफिक्स ड्राइवर जिस तरह से स्वचालित रूप से मेमोरी को अंदर और बाहर पृष्ठ सकता है। क्या यह सीपीयू संसाधनों के लिए भी सही है; यानी, किसी दिए गए संसाधन को वर्चुअल मेमोरी की उपस्थिति में भी लोड किया जाना और अनलोड किया जाना हमेशा बेहतर होता है?


1
आप मान रहे हैं कि परिसंपत्ति सामग्री सिस्टम मेमोरी में संग्रहीत है। आपका अधिकांश परिसंपत्ति डेटा GPU मेमोरी में संग्रहीत किया जाएगा, जो कि बहुत अधिक सीमित है।
दादू गेम्स

यहाँ उत्तर को पढ़ने से मुझे यह विचार मिलता है कि OpenGL ड्राइवर सीपीयू पर सभी बफ़र्स / टेक्सचर को स्वचालित रूप से रखता है। हालांकि, मैं देख सकता हूं कि अतुल्यकालिक अपलोड का लाभ लेने के लिए इन हस्तांतरणों को मैन्युअल रूप से निर्दिष्ट करना उपयोगी क्यों हो सकता है ।
जमैगफिन

क्या आप सुनिश्चित हैं कि यह आपके गेम प्रोजेक्ट के लिए प्रासंगिक है? मुझे यकीन नहीं है कि मैं तकनीकी चुनौती देख रहा हूं, केवल समाधान। यदि आप एक तकनीकी चुनौती का सामना नहीं कर रहे हैं, तो एक समाधान को समझना या एक को समझना मुश्किल है।
अट्टुरसम्स

मैं सोच रहा हूँ कि क्यों खेल इंजन जटिल परिसंपत्ति कैशिंग सिस्टम को लागू करते हैं जब ऑपरेटिंग सिस्टेम / ड्राइवर पहले से ही वर्चुअल मेमोरी सिस्टम उपलब्ध होते हैं। यह मेरे लिए प्रासंगिक है क्योंकि मैं एक ओपन-वर्ल्ड गेम लिख रहा हूं जहां यह जानकारी बहुत महत्वपूर्ण है।
२०:०५ पर जेमगफिन

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

जवाबों:


16

आधुनिक खुली दुनिया के खेल बस स्मृति में फिट नहीं होते हैं। ध्यान रखें कि 32-बिट OSes वाले गेमर्स की संख्या के कारण अधिकांश गेम अभी भी 32-बिट के हैं, और 32-बिट की प्रक्रिया में एक समय में केवल 4GB एड्रेस की गई मेमोरी हो सकती है (वर्चुअल मेमोरी से स्वतंत्र) लेकिन वास्तविक रूप से 2-3 जीबी तक सीमित। विखंडन में टॉस और एक समय में एक मेमोरी में आपके द्वारा उपयोग की जा सकने योग्य वस्तुओं की वास्तविक मात्रा एक बड़े पर्यावरण के लिए आवश्यक कुल आंकड़ों की तुलना में काफी कम है। 64-बिट OS पर भी, आपको अधिकतम एंड-यूज़र अनुकूलता सुनिश्चित करने के लिए अक्सर केवल 4GB मेमोरी वाले कम-स्पेक मशीनों को लक्षित करने की आवश्यकता होती है। चलो मोबाइल उपकरणों को मत भूलना, "अंडर-पावर्ड" हार्डवेयर जैसे कि WiiU, आदि। डेवलपर्स को बड़े फैंसी गेमिंग पीसी रिग्स से बहुत अधिक लक्ष्य करना होगा।

वर्चुअल मेमोरी एक समाधान नहीं है, सबसे पहले क्योंकि यह पता स्थान सीमाओं को नकारता नहीं है और इसलिए भी क्योंकि यह इष्टतम नहीं है। ओएस चीजों को इनोपपोर्ट्यून समय पर या inopportune तरीके से पृष्ठ कर सकता है। यह OSes द्वारा एक समस्या थी जब हाइबरनेशन पहली बार आसपास आया था; डिस्क में प्रक्रियाओं को पेजिंग करना और फिर उन्हें वापस पेजिंग करना कुछ मामलों में महत्वपूर्ण रूप से धीमा था, क्योंकि आवेदन स्पष्ट रूप से संसाधन को वापस स्ट्रीम कर रहा है। आप अभी भी समस्याओं को देख सकते हैं जब कोई सिस्टम मेमोरी से बाहर चल रहा है, तो पेज आउट किए जाते हैं। डिस्क, और सिस्टम अप्रतिसादी हो जाता है कि आपके WM / explorer.exe को चलाने के लिए आवश्यक चीजें महत्वपूर्ण हो जाती हैं। वर्चुअल मेमोरी दशकों पहले एक समस्या का समाधान था, जिसमें सिस्टम की रैम बहुत कम थी और मेमोरी और डिस्क की गति के बीच का अंतर बहुत छोटा था। आज भी' सबसे तेज़ एसएसडी सस्ते / धीमी रैम की गति का एक छोटा सा अंश हैं, और यह दिखावा करने की कोशिश कर रहे हैं कि आप अपनी डिस्क को वर्चुअल रैम के रूप में उपयोग कर सकते हैं बस अब सबसे अच्छा विचार नहीं है। यह एक ऐसी उम्र है जहां कुछ लोग रैम डिस्क में विपरीत और लोड सिस्टम फाइल करते हैं; वर्चुअल मेमोरी के निर्माण में बाधाएँ अब और सत्य नहीं हैं।

डिस्क मुद्दे से अलग, कस्टम संसाधन प्रबंधन अभी भी खेल के विकास का एक बड़ा हिस्सा है। डिबगिंग हुक से लेकर विखंडन की चिंताओं तक जटिल संसाधनों की बुद्धिमान स्ट्रीमिंग के लिए, बस पूरी दुनिया का दिखावा एक असीम रूप से बिट्स का बड़ा बॉक्स यथार्थवादी नहीं है।


विस्तृत उत्तर के लिए धन्यवाद। हालांकि मैं अभी भी जीपीयू ड्राइवरों को वर्चुअल मेमोरी (वीआरएएम और सिस्टम रैम के बीच) को संभालने के तरीके के बारे में कुछ जानकारी ढूंढ रहा हूं।
jmegaffin

@ बोरियल: समान मुद्दे। बस "RAM" को "VRAM" और "डिस्क" से "CPU मेमोरी" से
बदलें

@SeanMiddleditch +1 अच्छा जवाब, "यह एक ऐसी उम्र है, जिसमें कुछ लोग रैम डिस्क में विपरीत और लोड फाइल सिस्टम को करते हैं" क्या आपका मतलब है मेमोरी मैप की गई फाइलें? इसके अलावा मैं आपके उत्तर से जो समझ रहा हूं वह यह है कि कस्टम मेमोरी एलोकेटर ओएस को मेमोरी को पेजिंग-आउट करने से रोकता है, क्या यह मामला नहीं है, क्योंकि स्मृति आप तक कर्नेल से ब्रैक () का उपयोग करते हुए मेमोरी मांगती है, कैसे पीसी पर पेजिंग बिल्कुल एक कस्टम मेमोरी एलोकेटर का उपयोग करके रोका जाता है?
concept3d

1
@ concept3d: मेमोरी मैपिंग नहीं, बल्कि शाब्दिक रैम डिस्क। आप एक ड्राइव बना सकते हैं जो मेमोरी द्वारा समर्थित है और डिस्क से नहीं। कस्टम मेमोरी मैनेजर पेजिंग को रोकता नहीं है (कुछ अन्य ऐप सभी मेमोरी का उपयोग कर सकते हैं)। संसाधनों को समझदारी से (वस्तु / संसाधन प्रबंधन परत पर) प्रबंधित करने का सीधा सा अर्थ है कि आप उन वस्तुओं के लिए स्मृति मुक्त कर दें जिनकी आपको अब आवश्यकता नहीं है। ओएस के डिस्क कैश के बारे में सोचें जो इसे याद में रखता है
सीन मिडलडिच

6

32-बिट गेम के लिए, क्योंकि अधिकांश गेम कई कारणों से होते हैं, यहां तक ​​कि एक गेम जो एक-तरफा डीवीडी (4.3 जीबी) पर आता है, उसमें पहले से ही अधिक सामग्री होती है जिसे 32-बिट एड्रेस स्पेस में फिट किया जा सकता है। और यह मानते हुए कि सामग्री डिस्क पर संपीड़ित नहीं है, और पूरी तरह से इष्टतम है, सब कुछ एक ही बार में सन्निहित पते अंतरिक्ष दृष्टिकोण में लोड करें। कई खेल अब कई डीवीडी पर आते हैं, आसानी से 10GB सामग्री को पार करते हैं। पीसी पर मेरे अनुभव में, एक बार आपका पता स्थान 2GB आबंटन के लिए विफल होना शुरू हो जाएगा, और यह एक कठिन सीमा बन जाती है, भले ही उपयोगकर्ता की भौतिक स्मृति कितनी भी हो।

यदि आप 64-बिट करने के लिए कूद करते हैं, तो यह मानते हुए कि आपका इंजन इसका समर्थन करता है, यह कठिन सीमा दूर हो जाती है, केवल एक प्रभावी नरम सीमा द्वारा प्रतिस्थापित किया जाता है - जैसे ही वर्चुअल मेमोरी स्वैपिंग शुरू होती है, खेल का प्रदर्शन गिर जाएगा अस्वीकार्य। यदि मुख्य प्रक्रिया में मेमोरी के वापस आने का इंतजार करना पड़ता है, तो फ्रेम-दर हकलाना और गड़बड़ हो जाएगा। वर्चुअल मेमोरी उस पारदर्शी को बना सकती है, लेकिन यह उसे प्रदर्शन योग्य नहीं बनाती है। भौतिक रूप से उस मेमोरी को डिस्क से वापस लाने में समय लगता है, और जब आप प्रतीक्षा कर रहे होते हैं, तो आपका गेम रुक जाता है। हालांकि, इसके आसपास काम करना संभव है (स्मृति पृष्ठों की पृष्ठभूमि पूर्व-प्राप्ति के साथ जो आपको पता है कि आपको जल्द ही आवश्यकता होगी), यह एक कठिन और अविश्वसनीय प्रक्रिया है, और अभी भी प्रदर्शन निहितार्थ होंगे।

डिस्क पर स्वैप करने के लिए कौन से पृष्ठ आपके गेम का कोई ज्ञान नहीं है और इसे आगे क्या होने की संभावना है, यह तय करने के लिए ओएस के एल्गोरिदम। इसके अलावा, ओएस को अभी भी आपके गेम के साथ-साथ ओएस के साथ-साथ चल रहे अन्य एप्लिकेशन का समर्थन करना है। स्टाल होने के दौरान जब पेज डिस्क से लौटाए जाते हैं, तो यह एक बड़ा प्रदर्शन होता है, और इससे कोई फर्क नहीं पड़ता कि यह आपका गेम है, कोई अन्य एप्लिकेशन या ओएस जो इसे स्थापित करता है, गेम का प्रदर्शन बड़े पैमाने पर भुगतना होगा।

तो इस बात की परवाह किए बिना कि स्मृति सीमा नरम है या कठोर है, स्मृति अभी भी सीमित है। लेकिन यहां तक ​​कि अगर आप प्रदर्शन की एक सीमा को पकड़े बिना, एक ही बार में सब कुछ लोड कर सकते हैं, तो अभी भी ऐसे कारण हैं जो आप नहीं चाहते हैं:

  1. आपका गेम लोड होने में अधिक समय लेता है और जरूरत से ज्यादा इंटरएक्टिव अवस्था में पहुंच जाता है, क्योंकि यह बस शुरुआत में ही सब कुछ लोड कर देता है और इसे निवासी बनाये रखता है। आप हार्ड डिस्क से लगभग 150MB / सेकंड लोड कर सकते हैं, और यहां तक ​​कि सबसे तेज डीवीडी ड्राइव (24x) 33MB / सेकंड पर लोड कर सकते हैं। इसका मतलब है कि उदाहरण के लिए 4.3GB डीवीडी की सामग्री HDD से लोड होने में कम से कम 30 सेकंड और डीवीडी से लोड होने में 133 सेकंड से अधिक का समय लगेगा। वे अस्वीकार्य रूप से लंबे समय के लोड हैं।

  2. आपका खेल औचित्य की तुलना में बहुत अधिक स्मृति लेता है। यदि किसी एक समय में केवल 10% सामग्री दिखाई देती है, तो शेष निवासी को पकड़ना बस बेकार है, और उपयोगकर्ता को किसी अन्य चीज़ के लिए उस मेमोरी का उपयोग करने से रोकता है। उपयोगकर्ता आमतौर पर उन खेलों के प्रति अक्षम होते हैं, जिन्हें ठीक से चलाने के लिए बड़ी मात्रा में स्मृति की आवश्यकता होती है।

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


1

बस बहुत आम तौर पर और सरल रूप से बोलना, और आभासी स्मृति कार्यान्वयन के विवरण पर विचार किए बिना, डेवलपर को हमेशा दूरदर्शिता में ज्ञान होता है कि वीएम कार्यान्वयन में कमी है।

डेवलपर हमेशा कह सकता है, "मुझे इस ऑडियो फ़ाइल को अभी लोड करने की आवश्यकता नहीं है। अंदर का संगीत केवल स्क्रीन पर गेम के लिए उपयोग किया जाता है।" और स्क्रीन पर गेम के तुरंत बाद, डेवलपर कह सकता है, "मुझे इस ऑडियो क्लिप की अब भौतिक मेमोरी में आवश्यकता नहीं है। यह केवल स्क्रीन पर इस गेम के लिए उपयोग किया जाता है।"

OS में ऐसी कोई दूरदर्शिता नहीं है। यह पता लगाने में सक्षम हो सकता है, बाद में कई पृष्ठ दोष, कि कुछ ऑडियो क्लिप को अब भौतिक मेमोरी में ज़रूरत नहीं है क्योंकि यह एक अच्छा समय में एक्सेस नहीं किया गया है। लेकिन दूरदर्शिता को दृष्टिहीनता में बदलने से पृष्ठ दोषों में बहुत कुछ बदल जाता है, और बहुत सारे पृष्ठ दोष एक वीडियो गेम के रूप में एक सॉफ्टवेयर में फ्रेम दर में हिचकी का अनुवाद करते हैं। वहाँ डेवलपर की दूरदर्शिता वास्तव में मदद करता है अगर आप ऐसी हिचकी से बचना चाहते हैं।

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

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

व्यक्तिगत रूप से मैं कामना करता हूं कि वर्चुअल मेमोरी मौजूद नहीं है क्योंकि यह प्रदर्शन की एक अतिरिक्त परत को उन तरीकों से अनपेक्षितता से जोड़ता है जो बहुत चरम और गलत तरीके से होते हैं, जिस तरह से वास्तव में अनुपयोगीता के बिंदु पर दक्षिण जाने पर बहुत अधिक प्रदर्शन जुर्माना होता है।। मैं कभी-कभी उन मामलों में भाग लेता हूं जहां मैंने कुछ एप्लिकेशन का उपयोग किया था जहां मैंने कुछ इनपुट फ़ील्ड में नशे में होने पर दुर्घटना द्वारा एक अतिरिक्त अंक या दो टाइप किया था, जिसके कारण यह इतनी जल्दी भौतिक मेमोरी को समाप्त कर देता था जो ओएस को क्रॉल में लाता था जहां मैं कर सकता था ' यहां तक ​​कि प्रगति बार पर रद्द बटन पर भी क्लिक न करें और Ctrl + Alt + Del को जाम करने के दौरान 10 मिनट इंतजार करना पड़ा, एक प्रक्रिया को मारने के लिए और अपने आप को कोसते हुए अपने पेय को एक बिंदु पर वापस लाने के लिए शाप दिया, जहां चीजें फिर से उपयोग करने योग्य हैं, और वह पृष्ठ फ़ाइल के बावजूद एक SSD पर संग्रहीत किया जा रहा था। उन मामलों में मैंने "मेमोरी से बाहर" त्रुटि या कुछ और पसंद किया होगा, जिस बिंदु पर मैं अपने 17 टैब में से कुछ पोर्नो को बंद कर सकता हूं (यह ठीक है, मैं वैसे भी अपने पसंदीदा को बुकमार्क करता हूं) कुछ मेमोरी को मुक्त करने और फिर तुरंत जाने के लिए मेरा व्यवसाय फिर से शुरू करना।

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