ईसीएस? मैं वास्तव में सुझाव दूंगा कि यह समय से पहले नहीं हो सकता है यदि डिजाइन के डेटा-उन्मुख पक्ष में बहुत सारे विचार रखे जाएं और विभिन्न प्रतिनिधि को बेंचमार्क करें क्योंकि यह आपके इंटरफ़ेस डिजाइनों को प्रभावित कर सकता है , और बाद में देर से बदलने के लिए उत्तरार्द्ध बहुत महंगा है। खेल। इसके अलावा ECS सिर्फ बहुत सारे काम की मांग करता है और इसके बारे में सोचता है और मुझे लगता है कि यह उस समय के उपयोग के लायक है, यह सुनिश्चित करने के लिए कि यह आपको डिज़ाइन-स्तरीय प्रदर्शन दुःख नहीं दे रहा है आगे लाइन को नीचे दिया गया है कि यह आपके दिल में कैसे चल रहा है। पूरे चरमराई इंजन। इस भाग से मुझे झलक मिलती है:
unordered_map<string,[yada]>
यहां तक कि छोटे स्ट्रिंग ऑप्टिमाइज़ेशन के साथ, आपके पास एक चर-आकार का कंटेनर (स्ट्रिंग्स) एक और चर-आकार के कंटेनर (unordered_maps) के अंदर होता है। वास्तव में, छोटी स्ट्रिंग अनुकूलन वास्तव में इस मामले में सहायक के रूप में हानिकारक हो सकता है यदि आपकी तालिका बहुत विरल है, क्योंकि छोटे स्ट्रिंग अनुकूलन का अर्थ होगा कि हैश तालिका के प्रत्येक अप्रयुक्त सूचकांक अभी भी एसएस अनुकूलन (मेमोरी) के लिए अधिक मेमोरी का उपयोग sizeof(string)
करेंगे। उस बिंदु पर अधिक बड़ा होना) जहां आपकी हैश टेबल की कुल मेमोरी ओवरहेड हो सकती है, जिसमें आप जो कुछ भी स्टोर कर रहे हैं, उससे अधिक खर्च हो सकता है, खासकर अगर यह एक स्थिति घटक की तरह एक सरल घटक है, तो इसके अलावा अधिक स्टड के साथ अधिक कैशे मिस हो जाती है हैश तालिका में एक प्रविष्टि से अगले करने के लिए प्राप्त करने के लिए।
मैं मान रहा हूं कि स्ट्रिंग किसी प्रकार की कुंजी है, जैसे घटक आईडी। यदि हां, तो यह पहले से ही चीजों को नाटकीय रूप से सस्ता बनाता है:
unordered_map<int,[yada]>
... यदि आप चाहते हैं कि उपयोगकर्ता के अनुकूल नाम होने के लाभ जो स्क्रिप्टर्स उपयोग कर सकते हैं, जैसे, तो नजरबंद तार आपको यहां दोनों दुनिया का सर्वश्रेष्ठ दे सकते हैं।
उन्होंने कहा, यदि आप स्ट्रिंग को घनीभूत रूप से उपयोग किए जाने वाले सूचकांकों की काफी कम रेंज में मैप कर सकते हैं, तो आप ऐसा करने में सक्षम हो सकते हैं:
vector<[yada]> // the index and key become one and the same
जिस कारण से मैं इस समय से पहले विचार नहीं करता, क्योंकि फिर से, यह आपके इंटरफ़ेस डिज़ाइनों को प्रभावित कर सकता है। DOD की बात यह होनी चाहिए कि एक ही IMO में कल्पनाशील सबसे कुशल डेटा अभ्यावेदन के साथ आने की कोशिश की जाए (जो कि आम तौर पर आवश्यकतानुसार इसे हासिल किया जाना चाहिए), लेकिन उनके साथ काम करने के लिए शीर्ष पर इंटरफेस डिजाइन करने के लिए पर्याप्त रूप से सोचने के लिए ऐसा डेटा जो आपको प्रोफ़ाइल डिजाइन परिवर्तनों के बिना प्रोफ़ाइल और अनुकूलन के लिए पर्याप्त श्वास कक्ष छोड़ देता है।
एक भोले उदाहरण के रूप में, एक वीडियो प्रोसेसिंग सॉफ्टवेयर जो इस के खिलाफ अपने कोड के सभी जोड़े:
// Abstract pixel that could be concretely represented by
// RGB, BGR, RGBA, BGRA, 1-bit channels, 8-bit channels,
// 16-bit channels, 32-bit channels, grayscale, monochrome,
// etc. pixels.
class IPixel
{
public:
virtual ~IPixel() {}
...
};
छवि के स्तर पर अमूर्त की तुलना में एकल पिक्सेल स्तर पर अमूर्त करने के बिना दूर नहीं होने जा रहा है, क्योंकि एकल पिक्सेल स्तर पर अमूर्त करने का विचार पहले से ही बेहद अक्षम है ( vptr
खुद को अक्सर पूरे पिक्सेल की तुलना में अधिक स्मृति खर्च होगी)। अक्सर लाखों पिक्सल का प्रतिनिधित्व करते हैं)। इसलिए अपने डेटा अभ्यावेदन में अग्रिम रूप से पर्याप्त विचार रखें ताकि आपको इस तरह के बुरे परिदृश्य का सामना न करना पड़े, और आदर्श रूप से और नहीं, लेकिन यहाँ मुझे लगता है कि यह इस सामान के बारे में सोचने लायक है क्योंकि आप इसे नहीं बनाना चाहते हैं अपने ECS के चारों ओर जटिल इंजन और पाते हैं कि ECS स्वयं उन तरीकों में अड़चन है, जिनके लिए आपको डिज़ाइन स्तर पर चीजों को बदलने की आवश्यकता होती है।
जैसा कि ईसीएस कैश की याद आती है, मेरी राय में डेवलपर्स अक्सर अपने ईसीएस को कैश-फ्रेंडली बनाने के लिए बहुत कोशिश करते हैं। यह हिरन के लिए बहुत कम धमाके का उत्पादन करना शुरू कर देता है ताकि आपके सभी घटकों को पूरी तरह से सन्निहित फैशन तक पहुंचने की कोशिश की जा सके, और अक्सर सभी जगह डेटा की नकल और फेरबदल किया जाएगा। यह आमतौर पर काफी अच्छा है, कहते हैं, सिर्फ रेडिक्स सॉर्ट घटक सूचकांकों को एक्सेस करने से पहले ताकि आप उन्हें इस तरह से एक्सेस कर रहे हैं जहां आप कम से कम एक मेमोरी क्षेत्र को कैश लाइन में लोड नहीं कर रहे हैं, केवल इसे निकालने के लिए, और फिर लोड करें यह सब एक ही लूप में फिर से एक ही कैश लाइन के एक अलग हिस्से तक पहुंचने के लिए है। और एक ECS को बोर्ड भर में अद्भुत दक्षता प्रदान करने की आवश्यकता नहीं है। यह एक इनपुट सिस्टम से उतना लाभ नहीं है, जितना कि भौतिकी या प्रतिपादन प्रणाली से है, इसलिए मैं "अच्छा" के लिए लक्ष्य बनाने की सलाह देता हूं। बोर्ड भर में दक्षता और "उत्कृष्ट" सिर्फ उन जगहों पर जहां आपको वास्तव में इसकी आवश्यकता है। उस ने कहा, का उपयोग करेंunordered_map
और string
यहाँ से बचने के लिए काफी आसान हैं।