जब मैं इंजन कोडिंग कर रहा हूँ, मैं अक्सर केवल एक निश्चित के साथ संबंध रहा हूँ n
: मैं पहले से ही एक spacial विभाजन प्राप्त वस्तुओं की संख्या को सीमित मिल गया है update()
, physics()
और render()
स्क्रीन और आसपास के क्षेत्रों पर लगभग उन लोगों के लिए। अधिकतम बैच आकार आमतौर पर प्रति गेम बहुत अच्छी तरह से परिभाषित होता है, हालाँकि यह आपके द्वारा योजनाबद्ध रूप से थोड़ा बड़ा होता है।
इस मामले में मैं बड़े-ओ के साथ उतना चिंतित नहीं हूं जितना कि मैं निरंतर कारक गुणक और निचले क्रम की शर्तों से संबंधित हूं। रनटाइम जैसे फंक्शन के लिए a*n^2 + b*n + c
(जो है O(n^2)
), मैं अक्सर कम करने a
और संभवतः खत्म करने से बहुत अधिक चिंतित हूं c
। एक सेटअप या फाड़ की लागत c
आनुपातिक रूप से बड़ी बनाम छोटी हो सकती है n
।
हालांकि, यह कहना नहीं है कि बिग-ओ (या अधिक विशेष रूप से बड़े-थीटा ) एक महान कोड गंध संकेतक है। O(n^4)
एक O(k^n)
ज्यामितीय समय के लिए कहीं और, या इससे भी बदतर देखें , और यह सुनिश्चित करने का समय है कि आप अन्य विकल्पों पर विचार कर रहे हैं।
जब मैं डेटा बनाने के उपकरण के साथ काम कर रहा होता हूं, तो मैं आमतौर पर बिग-ओ इष्टतमता के बारे में अधिक चिंतित होता हूं और कम बड़े-ओ के साथ एल्गोरिदम खोजने के लिए हुप्स के माध्यम से कूदता हूं। जबकि किसी दिए गए स्तर / स्ट्रीमिंग क्षेत्र में वस्तुओं की संख्या आम तौर पर अच्छी तरह से परिभाषित होती है, एक पूरे खेल में वस्तुओं / कला संपत्ति / कॉन्फ़िगरेशन फ़ाइलों / आदि की कुल संख्या नहीं हो सकती है। यह बहुत बड़ी संख्या भी है। यहां तक कि एक समानांतर डेटा बनाने के लिए भी, हम अभी भी एक मिनट के आदेश पर प्रतीक्षा करते हैं (मुझे पता है, व्हाइन व्हाइन - कंसोल के लिए डेटा बनाने में घंटों लग सकते हैं - हम ज्यादातर छोटे हैंडहेल्ड गेम हैं) एक jam data-clean && jam data
चक्र के माध्यम से जाने के लिए ।
एक विशिष्ट उदाहरण देने के लिए: यह वास्तव में एक पृष्ठभूमि टाइल-स्ट्रीमिंग एल्गोरिथ्म के साथ हाथ से निकल गया जो 8x8 256-रंग की टाइलें प्रवाहित करता है। बैकग्राउंड "लेयर्स" के बीच स्ट्रीमिंग बफ़र्स को साझा करना उपयोगी है, और एक ही बफ़र को साझा करने में हम उनमें से 6 तक हो सकते हैं। समस्या यह है कि आवश्यक बफर के आकार का आकलन सभी 6 परतों की संभावित स्थितियों पर आधारित है - और यदि वे एक प्राइम-नंबर चौड़ाई / ऊंचाई / स्क्रॉल दर हैं, तो आप जल्दी से एक संपूर्ण खोज में शामिल होने लगते हैं - समीप आने लगता हैO(6^numTiles)
- जो कई मामलों में "ब्रह्मांड की तुलना में अधिक लंबा होगा" श्रेणी में है। सौभाग्य से ज्यादातर मामले सिर्फ 2-3 परतें हैं, लेकिन फिर भी, हम आधे घंटे के रनटाइम से ऊपर हैं। फिलहाल, हम इन संभावनाओं के एक बहुत छोटे उपसमुच्चय का नमूना लेते हैं, जब तक कि निर्धारित समय बीतने तक (या हमने कार्य पूरा कर लिया है, जो कि छोटे डबल-लेयर कॉन्फ़िगरेशन के लिए हो सकता है) तक ग्रैन्युलैरिटी बढ़ाना। हम इस अनुमान को थोड़ा बढ़ा देते हैं कि पूर्व के आंकड़ों के आधार पर हम कितनी बार गलत साबित हुए हैं, और फिर अच्छे उपाय के लिए थोड़ा अतिरिक्त पैडिंग जोड़ते हैं।
एक अन्य मजेदार उदाहरण: कुछ समय पहले पीसी गेम पर, लीड इंजीनियर ने स्किप सूची के साथ कुछ समय के लिए प्रयोग किया । मेमोरी ओवरहेड अधिक कैश प्रभाव पैदा करता है, जो पूरे चक्कर के लिए एक तरह का गैर-स्थिर गुणक जोड़ता है - इसलिए वे वास्तव में छोटे के लिए एक अच्छा विकल्प नहीं हैं n
। लेकिन बड़ी क्रमबद्ध सूचियों के लिए जहां खोजें अक्सर होती हैं, वे एक लाभ प्रदान करती हैं।
(मुझे अक्सर लगता है कि भोली एल्गोरिथ्म अधिक बड़ा है-ओ, छोटे डेटा सेट पर तेज़, और समझने में आसान; अधिक दिलचस्प / जटिल वाले (जैसे पेट्रीसिया ट्राइ) लोगों को समझने और बनाए रखने के लिए कठिन हैं, लेकिन बड़े पर उच्च प्रदर्शन डेटा सेट।)