सामान्य तौर पर मुझे कितनी बार और कब अपना कोड ऑप्टिमाइज़ करना चाहिए?


13

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

याद रखें कि डोनाल्ड नुथ ने क्या कहा था "हमें छोटी क्षमताओं के बारे में भूलना चाहिए, 97% समय के बारे में कहना चाहिए: समय से पहले अनुकूलन सभी बुराई की जड़ है"

यह सुनिश्चित करने के लिए अनुकूलन करने का समय है कि मैं प्रयास बर्बाद नहीं कर रहा हूं। क्या मुझे इसे विधि स्तर पर करना चाहिए? कक्षा स्तर? मॉड्यूल स्तर?

इसके अलावा अनुकूलन का मेरा माप क्या होना चाहिए? टिक? फ्रेम रेट? कुल समय?

जवाबों:


18

जहां मैंने काम किया है, हम हमेशा प्रोफाइलिंग के कई स्तरों का उपयोग करते हैं; यदि आपको कोई समस्या दिखाई देती है, तो आप सूची को थोड़ा और नीचे ले जाते हैं जब तक आप यह पता नहीं लगा लेते हैं कि क्या हो रहा है:

  • "मानव प्रोफाइलर", उर्फ सिर्फ खेल खेलते हैं ; क्या यह कभी-कभी धीमा या "अड़चन" महसूस करता है? ध्यान देने योग्य झटकेदार एनिमेशन? (एक डेवलपर के रूप में, ध्यान दें कि आप कुछ प्रकार के प्रदर्शन के मुद्दों के प्रति अधिक संवेदनशील होंगे और दूसरों के प्रति अनजान होंगे। तदनुसार परीक्षण की योजना बनाएं।)
  • एफपीएस डिस्प्ले चालू करें , जो कि स्लाइडिंग-विंडो 5 सेकंड औसत एफपीएस है। गणना करने और प्रदर्शित करने के लिए बहुत कम ओवरहेड।
  • प्रोफ़ाइल सलाखों को चालू करें , जो कि सिर्फ quads (ROYGBIV रंग) की एक श्रृंखला है जो फ्रेम के विभिन्न भागों (जैसे vblank, preframe, अद्यतन, टक्कर, रेंडर, पोस्टफ़्रेम) को एक सरल "स्टॉपवॉच" टाइमर का उपयोग करते हुए कोड के प्रत्येक भाग का प्रतिनिधित्व करते हैं। । हम जो चाहते हैं उस पर जोर देने के लिए, हम 60 हर्ट्ज लक्ष्य फ्रेम के प्रतिनिधि होने के लिए बार के लायक एक स्क्रीन की चौड़ाई निर्धारित करते हैं, इसलिए यह देखना आसान है कि क्या आप बजट के तहत 50% (केवल एक अर्ध-बार) या 50% से अधिक हैं ( बार लपेटता है और डेढ़ बार बन जाता है)। यह बताना बहुत आसान है कि आम तौर पर ज्यादातर फ्रेम क्या खा रहे हैं: लाल = प्रस्तुत करना, पीला = अपडेट, आदि ...
  • एक विशेष इंस्ट्रूमेंट बिल्ड बनाएँ जो आवेषण को "स्टॉपवॉच" की तरह प्रत्येक और हर फ़ंक्शन के आसपास कोड बनाता है। (ध्यान दें कि ऐसा करते समय आप एक विशाल प्रदर्शन, dcache और icache हिट कर सकते हैं, इसलिए यह निश्चित रूप से घुसपैठ है। लेकिन अगर आपको सीपीयू पर एक उचित नमूना प्रोफाइलर या सभ्य समर्थन की कमी है, तो यह एक स्वीकार्य विकल्प है। आप चतुर भी हो सकते हैं। फ़ंक्शन में न्यूनतम डेटा दर्ज करने के बारे में / बाद में कॉल आउट और पुनर्निर्माण को फिर से दर्ज करें।) जब हमने अपना निर्माण किया था, तो हमने बहुत अधिक लाभकारी उत्पादन प्रारूप की नकल की ।
  • सभी के सर्वश्रेष्ठ, एक नमूना प्रोफाइलर चलाएं ; वीटीएन और कोडअनलिस्ट x86 और x64 के लिए उपलब्ध हैं, आपको विभिन्न सिमुलेशन या अनुकरण वातावरण मिले हैं जो आपको यहां डेटा दे सकते हैं।

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

ध्यान दें कि आप "प्रोफाइल बार" जैसे ग्राफ़ को लगातार मज़ेदार कर सकते हैं, इसलिए आप स्पाइक पैटर्न देख सकते हैं ("हम हर 7 फ्रेम में एक फ्रेम खो रहे हैं") या जैसे।

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

  • क्या हमें RAM में कैश करना चाहिए या डिस्क से "पुनः लोड" प्लेयर के लिए राज्य एनीमेशन फ्रेम करना चाहिए? प्रत्येक दुश्मन के बारे में कैसे? हम उन सभी को करने के लिए RAM नहीं है, लेकिन डिस्क लोड महंगे हैं! आप एक बार में 5 या 6 अलग दुश्मन पॉप अगर अड़चन देख सकते हैं! (ठीक है, कैसे चौंका देने वाला spawning के बारे में?)
  • क्या हम सभी कणों में एक ही प्रकार का ऑपरेशन कर रहे हैं, या एक ही कण में सभी ऑपरेशन कर रहे हैं? (यह एक icache / dcache tradeoff है, और उत्तर हमेशा स्पष्ट नहीं होता है।) कैसे सभी कणों को अलग-अलग खींचने और पदों को एक साथ संग्रहीत करने के बारे में (प्रसिद्ध "सरणियों की संरचना") बनाम सभी कण डेटा को एक स्थान पर रखना (" संरचना की सरणी ")।

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

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


6
  1. सही डेटा संरचनाओं और एल्गोरिदम का उपयोग करें।
  2. जब तक आप प्रोफ़ाइल नहीं करते तब तक माइक्रो-ऑप्टिमाइज़ न करें और जानें कि आपके हॉट स्पॉट कहाँ हैं।
  3. चतुर होने की चिंता मत करो। संकलक पहले से ही सभी छोटी चालें करता है जो आप सोच रहे हैं ("ओह! मुझे चार से गुणा करने की आवश्यकता है! मैं दो को छोड़ दूंगा!"
  4. कैश मिसेज पर ध्यान दें।

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

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

1
मैं आपके दोनों बिंदुओं से सहमत हूं, लेकिन मैं इसके तहत "सही डेटा संरचनाओं और एल्गोरिदम का उपयोग करता हूं।" यदि आप हर जगह ref-counted स्मार्ट पॉइंटर्स के आस-पास से गुजर रहे हैं और मतगणना के माध्यम से चक्रों से खून बह रहा है, तो आपने निश्चित रूप से गलत डेटा संरचना को चुना है।
उदार

5

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


यह मुझे गलत लगता है। निश्चित रूप से, मेरे '+' को हर बार कॉल किए जाने में दो बार लग सकता है, लेकिन यह वास्तव में एक तंग पाश में ही मायने रखता है। एक तंग लूप के अंदर, एक एकल '+' को बदलना लूप के बाहर '+' को बदलने से अधिक परिमाण के आदेश कर सकता है। एक माइक्रोसेकंड के दसवें के बारे में क्यों सोचते हैं, जब एक मिलीसेकंड बचाया जा सकता है?
18

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

यह उस नल की तरह है जो सूख जाता है। उस छोटी बूंद को बचाने की चिंता क्यों? - "यदि आपका नल प्रति सेकंड एक बूंद की दर से टपक रहा है, तो आप प्रति वर्ष 2700 गैलन बर्बाद करने की उम्मीद कर सकते हैं"।
काज

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

3

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

यदि आप एक प्रोफाइलर के बारे में नहीं जानते हैं, तो इसे जानें! यहाँ एक अच्छा ब्लॉग पोस्ट है जो एक प्रोफाइलर की उपयोगिता को प्रदर्शित करता है।

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

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


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

@ काज, अच्छा प्रोफाइलर्स, सभी सैकड़ों व्यक्तिगत एल्गोरिदम को खराब एल्गोरिदम के रूप में जोड़ते हैं और आपको कुल दिखाते हैं। आगे आप कहेंगे "लेकिन क्या होगा यदि आपके पास 10 बुरी विधियां हैं और सभी को 1/10 वीं आवृत्ति पर बुलाया जाता है?" यदि आप अपना सारा समय उन 10 तरीकों पर बिताते हैं, तो आप सभी कम लटके हुए फलों को याद नहीं करेंगे, जहाँ आपको अपने हिरन के लिए एक बहुत बड़ा धमाका होगा।
जॉन मैकडॉनल्ड

2

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

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

जैसा कि आप लिखते हैं, आपको यह जानना होगा कि ग्राफिक्स, भौतिकी, आदि के लिए बजट क्या हैं। आप ऐसा नहीं कर सकते हैं यदि आपको पता नहीं है कि आपका प्रदर्शन क्या होने जा रहा है, और आप इस बात का अंदाजा नहीं लगा सकते हैं कि बिना यह जाने कि दोनों का प्रदर्शन कैसा है, और इसमें कितनी कमी हो सकती है।

इसलिए पहले दिन से ही कुछ प्रदर्शन आँकड़े बनाए।

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

कम लटके फलों को उठाएं क्योंकि आप समय-समय पर बड़े सामान से निपटते हैं, और आपको ठीक होना चाहिए।


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

2

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

बहुत ही बेसिक आर्किटेक्चर बिछने के बाद आपको लगातार अपने प्रोफाइल को प्रोफाइल करना चाहिए।

प्रोफाइलिंग आपको सिर्फ गति बढ़ाने में मदद नहीं करेगा, यह आपको बग ढूंढने में मदद करेगा। यदि आपके कार्यक्रम में अचानक तेजी से परिवर्तन होता है, तो यह आमतौर पर बग के कारण होता है। यदि आपकी रूपरेखा नहीं है तो यह किसी का ध्यान नहीं जा सकता है।

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


1

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

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


0

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


0

यदि आपका कोड धीमा चल रहा है, तो एक प्रोफाइलर चलाएं और देखें कि वास्तव में यह धीमा चलाने के लिए क्या कारण है। या आप सक्रिय हो सकते हैं और पहले से ही एक प्रोफाइलर चल रहा है इससे पहले कि आप प्रदर्शन समस्याओं को नोटिस करें।

जब आपका फ्रैमरेट एक ऐसे बिंदु पर गिरता है जिसे खेल में नुकसान होने लगता है, तो आप अनुकूलन करना चाहेंगे। आपका सबसे संभावित अपराधी आपका CPU बहुत अधिक (100%) उपयोग किया जा रहा है।


मैं कहूंगा कि GPU CPU के समान ही है। वास्तव में, कैसे कसकर युग्मित चीजें होती हैं, इस पर निर्भर करता है कि पूरी तरह से आधे फ्रेम में सीपीयू भारी होना चाहिए, और दूसरी तरफ भारी जीपीयू बाध्य है। गूंगा प्रोफाइलिंग या तो 100% से कम उपयोग का रास्ता दिखा सकती है। सुनिश्चित करें कि आपका प्रोफाइल ठीक दानेदार है जो यह दिखाने के लिए पर्याप्त है (लेकिन इतना बारीक नहीं जितना कि घुसपैठ हो!)
जेसन

0

आपको अपने कोड का अनुकूलन करना चाहिए ... जितनी बार आपको आवश्यकता होती है।

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

कभी कभी यह कोड नहीं है। अतीत में मेरे द्वारा चलाई गई बहुत सी समस्याएं gpu- उन्मुख (दी गई हैं, यह iPhone पर थी)। कई ज्योमेट्री, अकुशल शेड्स को बैचेन न करते हुए, बहुत सारे ड्रॉ कॉल को भरें ...

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


0

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

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