क्या ऐसे मामले हैं जहां ग्लोबल्स / सिंगलटन खेल के विकास में उपयोगी हैं? [बन्द है]


11

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

तो क्या ऐसे मामले हैं जहां वैश्विक चर या एकल वास्तव में खेल के विकास में उपयोगी हैं?

जवाबों:


30

ये चीजें हमेशा उपयोगी हो सकती हैं । चाहे वह सबसे सुंदर या सबसे सुरक्षित समाधान हो या न हो, लेकिन मुझे लगता है कि खेल के विकास में कुछ हद तक व्यावहारिकता शामिल है।


मेरे मंत्र के बहुत करीब।
लाफुर वेज

15

निश्चित रूप से एक गैर-विस्तृत सूची, लेकिन यहाँ जाता है:

विपक्ष

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

या तो समर्थक या चोर

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

पेशेवरों

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

हम अपने हाथ के शीर्षकों में "वैश्विक सिंगलटन की संरचना" का उपयोग करते हैं। पीसी और कंसोल शीर्षक उन पर कम भरोसा करते हैं; हम ईवेंट-चालित / मैसेजिंग आर्किटेक्चर की ओर अधिक स्विच करेंगे। कहा गया है कि, पीसी / कंसोल शीर्षक अभी भी अक्सर एक केंद्रीय बनावट प्रबंधक का उपयोग करते हैं; चूंकि यह आम तौर पर एक ही साझा संसाधन (बनावट स्मृति) को लपेटता है, इसलिए यह हमारे लिए समझ में आता है।

यदि आप अपने एपीआई को अपेक्षाकृत साफ रखते हैं, तो जरूरत पड़ने पर (या!) एक सिंगलटन पैटर्न से बाहर रिफ्लेक्टर करना बहुत कठिन नहीं हो सकता है ...


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

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

4

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


2

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

मैं अक्सर उन चीजों के लिए वैश्विक चर का उपयोग करता हूं, जो एक इंजन के माध्यम से सभी तक पहुंच की आवश्यकता होती है। मेरा प्रदर्शन उपकरण एक अच्छा उदाहरण है जिसे मैं कॉल करने के लिए इंजन पर उपयोग करता हूं। कॉल सरल हैं; ProbeRegister (), ProbeHit () और ProbeScoped ()। उनकी वास्तविक पहुंच थोड़ी अधिक कठिन है और उनकी कुछ चीजों के लिए वैश्विक चर का उपयोग करता है।


2

ग्लोबल्स, और खराब रूप से कार्यान्वित सिंग्लेटन्स के साथ मुख्य समस्या अस्पष्ट निर्माण और विघटन के कीड़े हैं।

इसलिए यदि आप उन प्राइमिटिव्स के साथ काम करते हैं जिनके पास ये मुद्दे नहीं हैं या एक पॉइंटर के साथ इस मुद्दे के बारे में बहुत जानकारी है। फिर उन्हें सुरक्षित रूप से इस्तेमाल किया जा सकता है।

ग्लोबल्स का अपना स्थान है, गोटो के समान और इसे हाथ से खारिज नहीं किया जाना चाहिए, बल्कि देखभाल के साथ उपयोग किया जाना चाहिए।

Google C ++ स्टाइल गाइड में इसकी अच्छी व्याख्या है


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

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

1

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

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


1

मैं कुछ प्रकार के DI / IoC कंटेनर को एकल जीवनकाल के बजाय कस्टम लाइफटाइम प्रबंधन के साथ उपयोग करने की सलाह देता हूं (भले ही आप "एकल उदाहरण" आजीवन प्रबंधक का उपयोग करें)। कम से कम तब परीक्षण को सुविधाजनक बनाने के लिए कार्यान्वयन को स्वैप करना आसान है।


आप में से जो लोग नहीं जानते हैं, उनके लिए DI "डिपेंडेंसी इंजेक्शन" है, और IoC "नियंत्रण का व्युत्क्रम" है। लिंक: martinfowler.com/articles/injection.html (मैंने पहले इन के बारे में पढ़ा था लेकिन कभी भी संक्षिप्त रूप में नहीं देखा था, इसलिए मुझे इस खोज में थोड़ा सा समय लगा।) +1 इस उत्कृष्ट परिवर्तन का उल्लेख करने के लिए।
लींडर

0

यदि आप एक सिंगलटन की मेमोरी सेविंग फीचर्स चाहते हैं तो शायद आप फ्लाईवेट डिज़ाइन पैटर्न आज़मा सकते हैं?

http://en.wikipedia.org/wiki/Flyweight_pattern

जहाँ तक कि बहु-धागा मुद्दों का उल्लेख किया गया है, यह केवल कुछ दूरदर्शिता के साथ संसाधनों के लिए लॉक तंत्र को लागू करने के लिए कुछ दूरदर्शिता के साथ होना चाहिए जो कि धागों के बीच साझा किया जा सकता है। http://en.wikipedia.org/wiki/Read/write_lock_pattern


0

एक प्रारंभिक अवस्था में एक साझा राज्य को संग्रहीत करने के लिए सिंगलनेट एक शानदार तरीका है।

वे एक चांदी की गोली नहीं हैं और कुछ समस्याओं के साथ आते हैं, लेकिन वे कुछ यूआई / लॉजिक राज्यों के लिए एक बहुत ही उपयोगी पैटर्न हैं।

IOS में उदाहरण के लिए, आप [UIApplication साझाApplication] प्राप्त करने के लिए एकल का उपयोग करते हैं, cocos2d में आप इसका उपयोग कुछ वस्तुओं जैसे कि [CCNotifications ShareManager] के संदर्भ में कर सकते हैं और व्यक्तिगत रूप से मैं आमतौर पर एक [गेम साझानाम] सिंगलटन के साथ बाहर निकलता हूँ जहाँ मैं कर सकता हूँ स्टोर राज्य जो विभिन्न घटकों के बीच बहुत कुछ साझा किया जाता है।


0

वाह, यह मेरे लिए दिलचस्प है, क्योंकि मुझे व्यक्तिगत रूप से सिंगलटन पैटर्न में कोई समस्या नहीं है। मेरा वर्तमान प्रोजेक्ट निंटेंडो डीएस के लिए एक सी ++ गेम इंजन है, और मैं बहुत सारे हार्डवेयर एक्सेस यूटिलिटीज (यानी वीआरएएम बैंक, वाईफाई, दो ग्राफिक्स इंजन) को सिंगलटन इंस्टेंस के रूप में लागू कर रहा हूं, क्योंकि वे ग्लोबल सी को लपेटने के लिए हैं। अंतर्निहित लाइब्रेरी में कार्य करता है।


मेरा सवाल यह होगा कि आखिर सिंगल का इस्तेमाल क्यों किया जाए? मैं देखता हूं कि लोग एपीआई को सिंगलटन या ऐसी कक्षाओं के साथ लपेटना पसंद करते हैं जिनमें केवल स्थिर कार्य होते हैं, लेकिन कक्षा में परेशान क्यों होते हैं? यह मेरे लिए और भी आसान हो गया है कि फंक्शन कॉल्स (आपके इच्छानुसार लिपटी हुई) हों, लेकिन तब आंतरिक रूप से वे "ग्लोबल" अवस्था में पहुँचते हैं। उदाहरण के लिए :: GetInstance () -> LogError ...
डैश-टॉम-बैंग

0

केवल जब आपके पास एक आइटम होता है जिसमें केवल एक नियंत्रक होता है लेकिन कई मॉड्यूल द्वारा नियंत्रित किया जाता है।

उदाहरण के लिए, माउस इंटरफ़ेस। या जॉयस्टिक इंटरफ़ेस। या संगीत खिलाड़ी। या साउंड प्लेयर। या स्क्रीन। या फ़ाइलों को बचाने प्रबंधक।


-1

ग्लोबल्स बहुत तेज हैं! तो यह एक खेल की तरह एक प्रदर्शन गहन अनुप्रयोग के लिए पूरी तरह से फिट होगा।

सिंगलटन एक बेहतर वैश्विक, IMO और इस प्रकार सही उपकरण हैं।

इसे संयम से प्रयोग करें!


बहुत तेजी से क्या ? ग्लोबल्स कुछ रैंडम मेमोरी पेज में होने जा रहे हैं यदि वे एक पॉइंटर हैं, और कुछ निश्चित लेकिन संभवतः दूर के मेमोरी पेज हैं तो वे एक वैल्यू हैं। संकलक उन पर किसी भी उपयोगी peephole अनुकूलन का उपयोग नहीं कर सकता है। किसी भी उपाय से मैं सोच सकता हूं, ग्लोबल्स धीमे हैं

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

लेकिन ग्लोबल्स के साथ किसी भी तुल्यकालन समस्याओं को हल करने के लिए आपको उनके लिए गेटर्स / सेटर की आवश्यकता होती है, इसलिए यह वास्तव में प्रासंगिक नहीं है। वैश्विक राज्य के साथ (और दुर्लभ लाभ) समस्या यह है कि यह वैश्विक राज्य है, इंटरफ़ेस के गति या प्रभावी रूप से (सिंटैक्स) पहलुओं के बारे में कोई चिंता नहीं है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.