बहुत जल्दी अनुकूलन करना इतना बुरा क्यों है?


168

अनुकूलन को थोड़ा देखने के बाद, मुझे पता चला है (शाब्दिक रूप से हर जगह) कि यह एक गेम को जल्दी से ऑप्टिमाइज़ करने के लिए एक सार्वभौमिक मान्यता प्राप्त पाप है।

मैं वास्तव में इसे नहीं समझता, क्या खेल के कुछ मुख्य ढांचे को अंत में पहली बार विकसित करने के बजाय उन्हें ध्यान में रखते हुए प्रदर्शन करना अविश्वसनीय रूप से कठिन नहीं होगा?

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

क्या कोई मुझे समझा सकता है कि इतनी जल्दी विचार करना इतना बुरा क्यों है?


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
जोश

3
इसका उत्तर देना आसान नहीं हो सकता है: "यह समय बर्बाद करता है"। आप पूछ सकते हैं कि "खरीदारी करते समय पैसे बचाने की कोशिश क्यों करें?"
fattie

27
इसके विपरीत, ध्यान दें कि बहुत से इंजीनियरों का कहना है कि वाक्य "बहुत जल्द अनुकूलन न करें" बस गलत है । वाक्य होना चाहिए, बस, "अनुकूलन न करें जब तक आप नहीं जानते कि क्या अनुकूलन करना है"। तो, काफी सरल रूप से, अगर तीन सिस्टम A, B और C हैं, तो यह पूरी तरह से व्यर्थ है A, यदि यह निकलता है, तो A किसी भी तरह से एक अड़चन नहीं है और C वास्तव में अड़चन है। उस उदाहरण में, स्पष्ट रूप से, A का अनुकूलन समय की पूरी बर्बादी होगी। तो - काफी बस - अनुकूलित न करें जब तक आप जानते हैं कि जो एक के, ई.पू. अनुकूलन करने के लिए: कि सभी इसका मतलब है कि है, यह इतना आसान है।
fattie

2
विकास के दौरान आपके आवेदन के समय वर्ग का अनुकूलन एक लूप से कुछ निर्देशों को दाढ़ी बनाने की कोशिश करने से बहुत अलग है जो आमतौर पर निरंतर समय है। इसके बजाय O (n) बनाम O (n log n) पर फोकस करें, "लूप के लिए इस तरह लिखने से एक सीपीयू इंस्ट्रक्शन बचता है"।

1
@phyrfox वास्तव में, लोड समय को कम करना मेरे लिए अधिक प्रभावशाली लगता है। तीन सेकंड लोड समय ध्यान देने योग्य है। मुझे यकीन नहीं है कि अगर 55fps से 60fps तक ध्यान देने योग्य है।
इमिबिज़

जवाबों:


237

प्रस्तावना:

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

"समय से पहले अनुकूलन न करें" का मतलब यह नहीं है कि "कोड लिखें जिसे आप जानते हैं कि यह बुरा है, क्योंकि नुथ कहते हैं कि आपको इसे अंत तक साफ करने की अनुमति नहीं है"

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

इसका मतलब है, जब संदेह में , हमें चाहिए:

  • वह कोड पसंद करें जो लिखने के लिए सरल हो, समझने में स्पष्ट हो, और शुरुआत के लिए संशोधित करना आसान हो

  • जांचें कि क्या आगे अनुकूलन की आवश्यकता है (आमतौर पर रनिंग प्रोग्राम को प्रोफाइल करके, हालांकि गणितीय विश्लेषण कर रहे नोटों के नीचे एक टिप्पणी - केवल एक जोखिम यह है कि आपको यह भी जांचना होगा कि आपका गणित सही है)

समयपूर्व अनुकूलन नहीं है :

  • अपने कोड को इस तरह से संरचना करने के लिए वास्तु निर्णय जो आपकी आवश्यकताओं को पूरा करेगा - एक उपयुक्त तरीके से उपयुक्त मॉड्यूल / जिम्मेदारियों / इंटरफेस / संचार प्रणाली का चयन करना।

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

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

उन सभी प्रकार के अनुकूलन अच्छी तरह से उचित हैं और आमतौर पर "समय से पहले" लेबल नहीं किया जाएगा (जब तक कि आप अपने 8x8 शतरंज के नक्शे के लिए अत्याधुनिक पाथफाइंडिंग को लागू करने वाले खरगोश छेद से नीचे नहीं जा रहे हैं ...)

तो अब इसके साथ ही यह स्पष्ट हो गया है कि हम इस नीति को विशेष रूप से खेलों में उपयोगी क्यों मान सकते हैं:


विशेष रूप से gamedev में, पुनरावृत्ति गति सबसे कीमती चीज है। हम अक्सर लागू करेंगे और अधिक विचारों को फिर से लागू करेंगे, अंत में समाप्त खेल के साथ जहाज करेंगे, "मज़ा खोजने के लिए"।

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

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

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

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

एक नाटकीय उदाहरण लेने के लिए: यदि आपका गेम GPU- बाउंड (असामान्य नहीं) है, तो उस सभी समय में हाइपर-ऑप्टिमाइज़िंग और CPU कार्य को फैलाने में कोई भी ठोस लाभ नहीं हो सकता है। उन सभी देव घंटों को बेहतर खिलाड़ी अनुभव के बजाय गेमप्ले सुविधाओं को लागू करने और चमकाने में खर्च किया जा सकता था।

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

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


38
यहां StackOverflow पर कुछ और चर्चा की गई है , कोड में पठनीयता और स्पष्टता के महत्व पर जोर दिया गया है, और समय से पहले अनुकूलन करके कोड को समझने के लिए कठिन (और बग को शुरू करने के लिए आसान) बनाने का खतरा है।
DMGregory

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

1
@ बाल्डरिक मैं कहूंगा कि एक अतिरिक्त उत्तर के रूप में साझा करने लायक है। (मैं इसे बढ़ा दूंगा!) मेरा उत्तर वास्तुकला के महत्व पर ध्यान देता है और पहली जगह में बड़ी समस्याएं पैदा करने से बचने की योजना बना रहा है। Gizmo के संदर्भ में "सामान्य रूप से कार्यक्रम विकास" के संदर्भ में, जहां समय से पहले अनुकूलन की यह अवधारणा है। जैसा कि ऊपर उल्लिखित है, गलत अनुकूलन एक लापता अनुकूलन के रूप में आसानी से तकनीकी ऋण बन सकता है। लेकिन हम पर ज़ोर देना चाहिए कि हम कभी एक जानबूझकर धीमी तरीके से काम कर रहे हैं, जब तक हम प्रोफ़ाइल कर सकते हैं और वास्तविक मुद्दों को खोजने के सादगी और स्पष्टता पसंद करते हैं
DMGregory

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

3
अतः आपने उचित परिश्रम किया और सत्यापित किया कि समस्या आपके कोड को बदलने से पहले वास्तविक थी जो शुरू में आपके लिए सबसे स्पष्ट और सबसे सहज थी। इसका मतलब है कि आपका अनुकूलन समय से पहले नहीं था। ;) "समय से पहले overoptimizing से बचें" का मतलब "अनावश्यक रूप से महंगा कोड लिखना" नहीं है - बस एक निश्चित प्रदर्शन समस्या की पहचान होने तक सादगी, सुगमता, संशोधन में आसानी। टिप्पणियाँ चर्चा के लिए अभिप्रेत नहीं हैं, इसलिए यदि आप इसके बारे में आगे बात करना चाहें तो हम चैट पर जा सकते हैं।
DMGregory

42

नोट: यह उत्तर DMGregory के उत्तर पर एक टिप्पणी के रूप में शुरू हुआ, और इसलिए वह बहुत अच्छे बिंदुओं की नकल नहीं करता है।

"खेल में कुछ मुख्य संरचनाओं को अंत में बदलने के लिए अविश्वसनीय रूप से मुश्किल नहीं होगा, बल्कि उन्हें प्रदर्शन को ध्यान में रखते हुए पहली बार विकसित करना होगा?"

यह, मेरे लिए, सवाल का क्रूस है।

अपना मूल डिज़ाइन बनाते समय, आपको दक्षता के लिए डिज़ाइन करने की कोशिश करनी चाहिए - शीर्ष स्तर पर। यह कम अनुकूलन है, और संरचना के बारे में अधिक है।

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

जब डिजाइन विकल्पों के साथ प्रस्तुत किया जाता है, तो आप जो करना चाहते हैं, उसके लिए सबसे उपयुक्त चुनते हैं।

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

विकल्प:

  • दूसरा फेरी खरीदें (समानांतर प्रसंस्करण)
  • नौका के लिए एक और कार डेक जोड़ें (यातायात का संपीड़न)
  • इसे तेज़ करने के लिए फ़ेरी के इंजन को अपग्रेड करें (पुन: लिखित प्रसंस्करण एल्गोरिदम)

यह वह जगह है जहां आपको अपने मूल डिजाइन को यथासंभव मॉड्यूलर बनाने का प्रयास करना चाहिए।
उपरोक्त सभी संभव अनुकूलन हैं, और आप तीनों भी कर सकते हैं।
लेकिन आप बड़े संरचनात्मक परिवर्तनों के बिना ये परिवर्तन कैसे करते हैं?

यदि आपके पास स्पष्ट रूप से परिभाषित इंटरफेस के साथ एक मॉड्यूलर डिजाइन है, तो इन परिवर्तनों को लागू करने के लिए सरल होना चाहिए
यदि आपका कोड कसकर युग्मित नहीं है, तो मॉड्यूल में परिवर्तन आसपास की संरचना को प्रभावित नहीं करते हैं।

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

tl; डॉ:

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

जब आप अनुकूलन करने की आवश्यकता हो, तब आप पूरे कोडबेस के पुनर्गठन के बिना प्रत्येक मॉड्यूल के भीतर तंत्र को बदल सकते हैं।


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

2
आपके पास इन मॉड्यूलर इंटरफेस के लिए लिखे गए स्वचालित परीक्षण भी हो सकते हैं, इसलिए आप मॉड्यूल के बाहर किसी भी चीज को तोड़ने के बारे में बहुत चिंता किए बिना तुरंत रिफ्लेक्टर कर सकते हैं जिसे आप छू रहे हैं।
user3067860

2
बहुत अच्छा उदाहरण क्यों OOP इन दिनों इतना महत्वपूर्ण है।
जैमे गालेगो

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

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

24

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

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

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

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

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

बहुत सारे अनुकूलन के साथ हाल के खेल के एक उदाहरण के रूप में, मैं फैक्टरियो को इंगित करता हूं। खेल का एक महत्वपूर्ण हिस्सा बेल्ट हैं - उनमें से कई हजारों हैं, और वे आपके कारखाने के चारों ओर सामग्री के कई व्यक्तिगत बिट्स ले जाते हैं। क्या खेल एक भारी-अनुकूलित बेल्ट इंजन के साथ शुरू हुआ था? नहीं! वास्तव में, मूल बेल्ट डिजाइन को अनुकूलित करना लगभग असंभव था - इसने बेल्ट पर वस्तुओं का एक भौतिक सिमुलेशन किया, जिसने कुछ दिलचस्प चीजें बनाईं जो आप कर सकते हैं (यह तरीका है जो आपको "आकस्मिक" गेमप्ले - गेमप्ले में आश्चर्य होता है) डिजाइनर), लेकिन आप बेल्ट पर हर एक आइटम अनुकरण करना था। हजारों बेल्टों के साथ, आपको शारीरिक रूप से नकली वस्तुओं के दसियों हिस्से मिलते हैं - यहां तक ​​कि इसे हटाने और बेल्ट को काम करने देने से आप संबंधित सीपीयू समय में 95-99% तक कटौती कर सकते हैं, यहां तक ​​कि मेमोरी इलाके जैसी चीजों पर विचार किए बिना। लेकिन यह केवल तब करना उपयोगी है जब आप वास्तव में उन सीमाओं तक पहुंचते हैं।

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

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

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

शीर्ष पर एक चेरी के रूप में, विचार करें कि अनुकूलन कभी समाप्त नहीं होता है। यह थोड़ा चेक मार्क वाला कार्य नहीं है जिसे आप समाप्त करते हैं और अन्य कार्यों के लिए आगे बढ़ते हैं। हमेशा "एक और अनुकूलन" आप कर सकते हैं, और किसी भी विकास का एक बड़ा हिस्सा प्राथमिकताओं को समझ रहा है। आप अनुकूलन के लिए अनुकूलन नहीं करते हैं - आप इसे एक विशेष लक्ष्य प्राप्त करने के लिए करते हैं (जैसे कि "स्क्रीन पर 200 इकाइयाँ 333 मेगाहर्ट्ज पेंटियम पर" एक महान लक्ष्य है)। टर्मिनल लक्ष्य का ध्यान न रखें क्योंकि आप मध्यवर्ती लक्ष्यों पर बहुत अधिक ध्यान केंद्रित करते हैं जो टर्मिनल टर्मिनल के लिए अब पूर्व-आवश्यकता भी नहीं हो सकते हैं।


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

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

@ फैटी तो आप सवाल समझ रहे हैं, लेकिन जवाब नहीं? क्या आप यह कहना चाह रहे हैं कि एक सरल उत्तर संभव है (उदाहरण के लिए "अर्थशास्त्र")? मैं नहीं देखता कि आपकी टिप्पणी रचनात्मक कैसे मानी जानी चाहिए।
लुआना

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

1
@ फेटी "केवल एक बार आप यह जान लें कि अड़चन क्या है" का उत्तर "मुझे कब अनुकूलित करना चाहिए?" और "बहुत जल्दी अनुकूलन करने के लिए इतना बुरा क्यों है?" इसका जवाब नहीं है
इबिबिस

10

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

हास्य के रूप में मैं पॉलीओमीनो की मदद से अपने दृष्टिकोण पर विस्तार करने का प्रयास करता हूं।

मान लीजिए कि हमारे पास जिस फ्रेमवर्क या इंजन के साथ हम काम कर रहे हैं, उसकी कुछ निश्चित सीमाएँ हैं।

यहां छवि विवरण दर्ज करें

हम तो इस तरह से खेल की हमारी पहली परत / मॉड्यूल बनाने के लिए आगे बढ़ते हैं।

यहां छवि विवरण दर्ज करें

आगे बढ़ते हुए हम अपनी दूसरी परत / मॉड्यूल बनाते हैं।

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें

बिल्कुल सही, अब आवेदन पूरी तरह से हमारे लिए उपलब्ध संसाधनों का उपयोग कर रहा है, आवेदन बेहतर है, अच्छा है?

हम अपने आवेदन की तीसरी परत / मॉड्यूल का निर्माण करने के लिए आगे बढ़ते हैं और अचानक हमें एक एहसास होता है (शायद एक भी हम प्रारंभिक योजना के दौरान पूर्वाभास नहीं कर सकते थे) कि 3 परत / मॉड्यूल हमारे लिए काम नहीं कर रहा है।

हम एक विकल्प की तलाश करते हैं, हम एक खोज करते हैं, और अंत में, हमें अपने एप्लिकेशन के 2 मॉड्यूल को बदलने की आवश्यकता है क्योंकि यह हमारे नए चयनित 3 मॉड्यूल के साथ असंगत है। (शुक्र है कि यह हमारे 1 मॉड्यूल के साथ कुछ हद तक संगत है, इसलिए हमें खरोंच से सब कुछ फिर से लिखना नहीं पड़ता है।)

इसलिए हमने इसे एक साथ रखा ...

यहां छवि विवरण दर्ज करें

हम्म, क्या आप देख सकते हैं कि क्या हुआ?

बहुत जल्दी अनुकूलन करके हमने अब वास्तव में चीजों को बदतर दक्षता-वार बना दिया है क्योंकि हम जो अनुकूलित करते हैं वह उस रेखा के साथ समाप्त नहीं होता है।

और अगर हम बाद में कुछ अतिरिक्त मॉड्यूल या अतिरिक्त tidbits जोड़ना चाहते थे, तो हम अब उन्हें इस बिंदु पर करने की क्षमता नहीं रख सकते।

यहां छवि विवरण दर्ज करें

और हमारे सिस्टम के निम्नतम स्तर को समायोजित करना अब संभव नहीं है क्योंकि यह अन्य सभी परतों के नीचे दफन किया गया है।

अगर, हालांकि, हमने तुरंत इसे अनुकूलित करने के लिए अपने आग्रह के साथ प्रतीक्षा करने का विकल्प चुना होगा, तो हम इस तरह से कुछ समाप्त कर देंगे:

यहां छवि विवरण दर्ज करें

और अब अगर हम इस बिंदु पर अनुकूलन करते हैं तो हमें देखने के लिए कुछ संतोषजनक मिलता है।

यहां छवि विवरण दर्ज करें

उम्मीद है कि कम से कम आप में से कुछ को यह पढ़कर बहुत मज़ा आया होगा क्योंकि मुझे यह बनाने में मज़ा आया :) और अगर अब आपको ऐसा लगता है कि आपके पास इस विषय पर बेहतर समझ है - सभी बेहतर।


3
मैं विज्ञापन निकाल रहा हूं। हम परवाह नहीं करते कि आपने चित्र कैसे बनाए; एकमात्र महत्वपूर्ण हिस्सा यह धारणा है कि आपको उन्हें पोस्ट करने का अधिकार है।
Gnemlock

2
@Gnemlock मेला पर्याप्त है, जबकि मेरा इरादा विज्ञापन की ओर नहीं था, मैं यह भी देख सकता हूं कि इसे कैसे आसानी से गलत तरीके से समझा जा सकता है, और मैं इस बात से सहमत हूं कि यह उत्तर में कुछ भी नहीं जोड़ता है, इसलिए इसमें कोई जगह नहीं है।
छत पर गेको

2
मुझे लगता है कि यह दृश्य रूपक बेहद प्रभावी है। सवाल का जवाब देने के लिए बढ़िया तरीका! :)
DMGregory

8

पैसे।

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

यहाँ बहुत जल्दी संभावित अनुकूलन के कुछ और संभावित दुष्प्रभाव हैं, और इसके कारणों से आपको बचना चाहिए:

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

* अन्य उत्तरों ने 'समय' भाग को अच्छी तरह से उजागर किया है


एक साइड नोट के रूप में, आम तौर पर , अनुभव यह निर्धारित करने में मदद करता है कि समय से पहले अनुकूलन क्या है और व्यवसाय के लिए क्या मूल्य है और क्या नहीं है।

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


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

3
@JBentley इसे DMGregory के जवाब के परिशिष्ट के रूप में समझें।
एलेक्जेंडर Vaillancourt

1
यह यहाँ केवल सार्थक उत्तर प्रतीत होगा। सवाल एक तनातनी का है। आप यह भी पूछ सकते हैं "तो क्यों, वास्तव में, क्या आप चाहते हैं कि एक गेम ऐप स्टोर पर कम पैसे के बजाय अधिक पैसा कमाए?" आप इसका जवाब कैसे दे सकते हैं?
फेटी

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

6

अनुकूलन, परिभाषा के अनुसार, किसी समाधान की दक्षता को उस बिंदु तक बढ़ाने की प्रक्रिया है जहां वह अपनी प्रभावकारिता खो देता है। इस प्रक्रिया का तात्पर्य है समाधान के स्थान में कमी।

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

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

समाधान का वास्तविक स्थान हमेशा हमारे द्वारा शुरू की गई अपेक्षा से बड़ा होता है क्योंकि हमें बहुत जटिल प्रणाली का सही ज्ञान नहीं हो सकता है।

इसे पहले काम करो। फिर रस्सियों को कस लें।


2
मुझे लगता है कि "प्रभावकारिता" वह शब्द नहीं है जिसके लिए आप जा रहे हैं - इसका मतलब है "एक प्रभाव पैदा करने की शक्ति", इसलिए एक अर्थ में, अनुकूलन सभी प्रभावकारिता बढ़ाने के बारे में है । क्या आप प्रभावकारिता के कुछ विशिष्ट संस्करण के लिए जा रहे हैं? (क्या आप इसे लिंक कर सकते हैं?) क्या आप इसके बजाय लचीलेपन की तरह कुछ मतलब है?
डोपेलग्रेनेर

2
@doppelgreener इसका मतलब है कि आप समाधान को तब तक अधिक कुशल बनाते हैं जब तक कि वह आपके द्वारा
वांछित

1
"इसे पहले काम करो। फिर रस्सियों को कसो।" - कि संयुक्त उत्तर के बाकी के रूप में ज्यादा के रूप में लायक होना चाहिए। और नहीं कहना है कि अन्य सामान अच्छा नहीं था।
ebyrob

1
@ebyrob: एक और कहावत है: "यह काम करो, इसे सही करो, इसे तेज करो" wiki.c2.com/?MakeItWorkMakeItRightMakeItFast
ninjalj

@ ननजालज यह भी अच्छा है। बेशक, मेरा बॉस हमेशा मुझसे कहता है: "जल्दी मत करो, इसे सही बनाओ।" इसलिए मुझे नहीं पता कि आप जो कह रहे हैं वह उतना ही सार्वभौमिक है जितना कि मूल पोस्टर के बारे में अधिक विस्तार से अनुरोध किया गया है।
ebyrob

2

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

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

सामान्य तौर पर, केवल तभी ऑप्टिमाइज़ करें जब आप वास्तव में इस पल के विकास के निर्माण के साथ काम नहीं कर सकते। जैसे यदि आप प्रति सेकंड 60 बार लाखों ऑब्जेक्ट बना रहे हैं और हटा रहे हैं।

इसलिए, मैं कहूंगा कि यह अच्छा है, सीखने के अनुभव के संदर्भ में, कुछ समय के शुरुआती समय में अनुकूलन करने के लिए: पी


2

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

अनुकूलन अंतर्दृष्टि नहीं लाता है। यह कंप्यूटर को कम और प्रोग्रामर को अधिक काम करता है।

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


यह अनुकूलन को परिभाषित करने के अलावा कुछ और के साथ अग्रणी द्वारा सुधार किया जाएगा, और कारों के बारे में उपमाओं के लिए जाने के बजाय खेल के विकास में व्यावहारिक स्थिति के बारे में बात करके।
डोपेलग्रेनर

एक सवाल का सही जवाब।
फेटी

2

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

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

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


5
यदि A * कोड को अनुकूलित करना शुरू करना चाहिए, तो "अनुकूलित" कितना अनुकूलित है? क्या आप बेंचमार्क करने से पहले विधानसभा में चीजों को नियंत्रित करते हैं? मुझे लगता है कि आम तौर पर सूक्ष्म-अनुकूलन पर गैर-तुच्छ काम तब तक छोड़ दिया जाना चाहिए जब तक कि बेंचमार्क नहीं किया गया हो। ऑप्टिमाइज़िंग कंपाइलर माइक्रो-ऑप्टिमाइज़ेशन की तुलना में आपसे बेहतर काम कर सकता है, और बहुत सस्ता है।
गमथ

@gmatht वेल ए * अलग हो सकता है क्योंकि मैंने कहा कि यह खराब डिजाइन हो सकता है और वास्तव में अच्छी तरह से काम नहीं करता है। लेकिन इसे गुणा किया जा सकता है, फिबोनाची ढेर के आधार पर, कुछ पूर्वानुमान हैं, जो विखंडू में विभाजित हैं। अगर हम पाथफाइंडिंग के बारे में बात कर रहे हैं, तो हम फ्लो फील्ड को A * के साथ मिला सकते हैं। साथ ही स्मूथिंग, मल्टी हाइट। शायद ए * सबसे अच्छा उदाहरण नहीं है, लेकिन जैसा कि मैंने कहा, अनुकूलन का वास्तव में कोड बदलने से कोई लेना-देना नहीं है, डेवलपर कोड बदल रहा है क्योंकि इसे खराब तरीके से डिजाइन किया गया था, उदाहरण के लिए उसने 1 कारण के रूप में ठोस का पालन नहीं किया था। यदि आप इस A * को अच्छी तरह से लिखा है, आपको इसे लिखने की आवश्यकता नहीं है।
उम्मीदवार चंद्रमा _Max_

@gmatht माइक्रो ऑप्टिमाइज़ेशन वास्तव में समस्या नहीं हैं। मुझे लगता है कि ओपी का मतलब एआई व्यवहार या shader या कुछ और की गणना करने का सबसे अच्छा और सबसे कुशल तरीका है।
उम्मीदवार चंद्रमा _Max_

यदि आप जानते हैं कि इस चीज़ को कुशलतापूर्वक कैसे लिखा जाए तो मुझे ऐसा करने में समस्या नहीं दिखती है। इसमें उतना ही समय लगेगा या कम भी लगेगा। यह डेवलपर्स के अनुभव पर अधिक निर्भर करता है। एक प्रोग्रामर के रूप में, अगर मुझे बेहतर समाधान पता है तो मैं एक भद्दा नहीं लिखूंगा। अगर मुझे पता है कि फाइबोनैचि हीप कैसे लिखना है, तो मैं सूची का उपयोग नहीं करूंगा और न्यूनतम या अधिकतम मान प्राप्त करने के लिए छंटनी करूंगा। बेशक, इसे List.Sort () का उपयोग करने के बजाय इसे लिखने में कुछ और समय और प्रयास लगेगा; , लेकिन क्या होगा यदि मेरे पास पहले से ही एक पुन: प्रयोज्य है?
उम्मीदवार चंद्रमा _Max_

2
@ कैंडिडमून मैं इससे असहमत हूं "यह उतना ही समय या उससे भी कम समय लेगा।" कुशल कोड लिखने के लिए। शायद यह कोड लिखने के लिए समान समय लगेगा जो स्पष्ट रूप से अक्षम नहीं है, लेकिन जब "प्रभावकारिता" की आपकी धारणा का अर्थ है कि कैश विवाद पर विचार करना, मल्टीथ्रेडिंग जोड़ना, केवल कुछ सीपीयू पर उपलब्ध सीपीयू विशिष्ट आंतरिक का उपयोग करना, ओ के कारण बड़े एन से एल्गोरिदम को स्विच करना। (एन लॉग एन) बनाम ओ (एन) - इस तरह की चीज कठिन और त्रुटि प्रवण है और सरल कार्यान्वयन की तुलना में बहुत अधिक समय लगता है। आप इसे केवल तब करते हैं जब आप जानते हैं कि यह अंतिम परिणाम को भौतिक रूप से प्रभावित करने वाला है।
माइकल एंडरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.